Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Журнал Витуса. ([info]lj_vitus_wagner)
@ 2018-09-05 10:26:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Границы бесконечности
Опять у меня проблемы с бесконечностью в языке C. (предыдущие серии вот и вот. Пора уже тэг заводить)

На этот раз с функцией isinf(), вернее __builtin_isinf() в clang

Народ долго разбирался почему и как и доразбирался до того, что


#include <stdio.h>
#include <math.h>

int main(int argc, char **argv)
{
    double d1 = (argc ? 1e180 : 0);
    double d2 = (argv ? 1e200 : 0);
    int r2 = __builtin_isinf(d1 * d2);
    int r1 = isinf(d1 * d2);
    printf("r1 = %d, r2 = %d\n", r1, r2);
    return 0;
}


Note that swapping the r1 and r2 lines makes the problem disappear (!).

on amd64, clang 3.9.1:

cc -O2 -m32 flttst.c && ./a.out
r1 = 1, r2 = 0

cc -O2 flttst.c && ./a.out
r1 = 1, r2 = 1


Выяснилось что 32-битная x86 архитектура, использующая 80-битные регистры сопроцессора работает с бо́льшим диапзоном вещественных чисел, чем 64-битная (использующая 64битные floating point registers)


Там в треде по ссылке еще много дивного узнать можно про современные компиляторы.

This entry was originally posted at https://vitus-wagner.dreamwidth.org/2022303.html. Please comment there using OpenID. Now there are Image comments


(Читать комментарии) (Добавить комментарий)