Перейти к содержанию
    

CPP / GCC / Linux Оператор = с делением на НОЛЬ

CPP / GCC / Linux  Оператор присваивания, с делением на НОЛЬ

Прорабатываю чужой код (c Github), и встретилось НЕЧТО для меня непонятное, как черная дыра.

            if (right->type == NUMBER && right->data.value == 0.0) 
			{
                root->type = NUMBER;
>>>>            root->data.value = 1.0 / 0.0;   // root->data.value == long double
                delete_node(left);
                delete_node(right);
                break;
            }

А как же .... как же школа, 2/3 класс .... надо достать учебник и перечитать ....

Правда компилятор MSVS ругается error C2124: divide or mod by zero
Или это "закладка" автора от "тупой" компиляции и использования ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

инициализация значения в inf? чтобы отличать "неинициализированную" переменную от числа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, _4afc_ said:

Попробуйте корень из -1. Возможно так NAN присваивают...

да, возможно. Наверное в GCC компилятор пропускает это (на рантайм все-равно вылезет).

9 minutes ago, _pv said:

инициализация значения в inf? чтобы отличать "неинициализированную" переменную от числа

по всей видимсти, да.

 

Всем спасибо за инф.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, _4afc_ сказал:

Попробуйте корень из -1. Возможно так NAN присваивают...

Если так, то это ужасно кривой метод. Почему не сделать нормально?:

//спец.значения float: +NaN и -NaN
union {
  u32 i;
  float f;
} const constPNaN = {B31 - 1}, constNNaN = {B31 - 1 | B31};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Если так, то это ужасно кривой метод. Почему не сделать нормально?:

может потому что это ещё хуже, так как "The value representation of floating-point types is implementation-defined"
в коде похоже как раз разбирается арифметическое выражение, и автор просто переложил на компилятор расхлёбывать деление на 0, тем же образом как плавучка в этом компиляторе и реализована.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, _pv сказал:

может потому что это ещё хуже, так как "The value representation of floating-point types is implementation-defined"
в коде похоже как раз разбирается арифметическое выражение, и автор просто переложил на компилятор расхлёбывать деление на 0, тем же образом как плавучка в этом компиляторе и реализована.

Чем же хуже? Тем что это работает, а то что заложил некий автор - не работает?  :wacko2:

И в каких современных компиляторах у нас плавучка не IEEE, а какой-то свой доморощенный формат?

Ну а если уж так этого бояться, то можно заложить соответствующий #ifdef/#endif для всех имплементаций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

51 minutes ago, jcxz said:

Чем же хуже? Тем что это работает, а то что заложил некий автор - не работает?  :wacko2:

И в каких современных компиляторах у нас плавучка не IEEE, а какой-то свой доморощенный формат?

Ну а если уж так этого бояться, то можно заложить соответствующий #ifdef/#endif для всех имплементаций.

не работает оно исключительно из-за своеобразного (как всегда впрочем) понимания микрософтом стандартов.

гцц и шланг знают что 1.0/0.0 == INF, а msvc почему-то нет.

не уверен точно, но вроде бы IAR и visualDSP умели в 16ти битные floatы. Ваш constPNaN им скорее всего тоже не понравится.

тем более что у ТС не float, а вообще long double с непонятной разрядностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jcxz said:

Если так, то это ужасно кривой метод. Почему не сделать нормально?: . . . 

Это интерпретатор формул. Возможно, сделано умышленно, тк "аффтар" формулы может написать в строке что угодно, в том числе и деление на ноль и "скормить" ЭТО интерпретатору. Хотя мне это тоже, подсазнательно, не нравится.

A parser and calculator for mathematical formulas written in C

https://github.com/ruester/fp  

 

Полностью скомпилировать код на MSVC не получиось по причине отсутствия нескольких макро-переменных и много-чего правки вручную.

 У меня нет необходимости компиляции, интересен подход в разборе формулы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 minutes ago, _pv said:

. . . гцц и шланг знают что 1.0/0.0 == INF, а msvc почему-то нет. . . .

MS останавливает "шаловливые ручки" уже на этапе компиляции когда видит набор знаков "/ 0.0". Грубая ошибка, INHO, которую в здравом уме не сделаешь.

(разве что в контексте искуственного создания ошибочных значений inf-nan о которых упоминали выше)

Более правильные компиляторы дадут ошибку на этапе исполнения, дабы аффтар осознал свой IQ.

(в случае этого кода - автора строки с ошибочной формулой которую задали исполнять интерпретатору)

 

ps

Да, в коде есть упоминание об "inf" в виде строки

static char *ldtostr(long double d)
{
    unsigned int digits;
    char *ret;
    long double h;

    if (d == HUGE_VAL || d == -HUGE_VAL)
        return (strdup("inf"));

. . . . 
. . . .

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, _pv сказал:

не уверен точно, но вроде бы IAR и visualDSP умели в 16ти битные floatы. Ваш constPNaN им скорее всего тоже не понравится.

Мой constPNaN взят как раз из проекта IAR.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоже так делаю, и да пришлось написать через union, чтобы все компиляторы понимали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужны эти магические числа NaN, INF, то почему бы их просто не взять из стандартной cmath?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/25/2019 at 7:59 AM, dxp said:

Если нужны эти магические числа NaN, INF, то почему бы их просто не взять из стандартной cmath?

Вот он, голос разума! :-)

https://en.cppreference.com/w/cpp/numeric/math/NAN

https://en.cppreference.com/w/cpp/numeric/math/INFINITY

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, esaulenka said:

Вот он, голос разума! :-) . . .

Ok Спасибо за инф.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...