[c] тип double
в принципе не должны, но весьма странно, если на одном процессоре разные
можешь посмотреть ассемблерный вывод, одинаковые ли там инструкции генерируются для собственно вычислений
я еще не знаю чем это кончится (не досчиталось)
По крайней мере, так нам говорил мой бывший семинарист по эвм
> компилятора на одном и том же процессоре.
вот это уже действительно несколько странно ....
> По крайней мере, так нам говорил мой
> бывший семинарист по эвм
как его зовут если не секрет? я бы хотел с ним это обсудить
P.S. и ключи компиляторов одинаковые!
в зависимости от компилятора, платформы...
так что не должны
P.S. и это даже если нет перестановок компилятором
я бы сказал, что если оптимизатор занимается такой фигнёй, то он превышает свои полномочия
как минимум, такая опасная фича должна быть выключена по умолчанию
тот преподаватель, скорее всего, хотел в максимально категоричной форме выразить, что _нельзя_закладываться_ на то, что результат будет одинаковым
>> компилятора на одном и том же процессоре.
>
> вот это уже действительно несколько странно ....
совсем даже нет
компилятор может иногда менять порядок выполнения операций
для чисел с плавающей точкой может запросто быть (a+b)+c != a+(b+c
поэтому сходящиея ряды, например, суммируют с конца
через ~час скажу результат
разумеется
но если юзер явно захочет какой-нибудь -fsuper-puper-fast-math, то сам виноват
вот ты и объяснил, почему оптимизатор не должен это менять
в своё время в методе деления пополам я писал c = a + 0.5*(b-a) , чтобы защититься от такого
А зовут его Сергей Яковлевич Ищенко.
не 5.0 / 2.0 , а 5 / 2.0
а критично это было из-за того, что бралось round(a/2.0 соответственно совсем разный результат получаем
согласен, но никакой -O9 не должен это включать
двоешник
это уже хуже .....
стопудово
по поводу ....99999...
преобразовать число с плавающей точкой в строку - задача нетривиальная и процесс преобразования может сам вносить некоторую погрешность
в другую сторону тоже самое, хотя 5, 5.0 и 2.0 слишком хорошие числа, чтобы это к ним относилось
у FPU есть несколько режимов округления, но там нет "нормального", который сделает 3 из 2.5 и 2 из 2.4(9)
там есть отбрасывание разрядов (ближайшее целое в сторону нуля округление вверх или вниз,
а также округление к ближайшему целому или чётному, т.е. из 2.5 и 1.5 он сделает 2
такая опасная фича должна быть выключена по умолчанию
гы-гы! В VC++ 7.1 все как раз наоборот
/Op disables optimizations that could change the precision of floating-point numbers
или я что-то путаю?
могут ли не совпадают такие штуки: a - b и a + - b?
---
...Я работаю антинаучным аферистом...
А вдруг там 2,4(9)8?
---
...Я работаю антинаучным аферистом...
double a;
unsigned b;
из контекста должно быть понятно, что именно там обозначено символом "2.4(9)", поэтому твоё замечание не в кассу
-1 scaled ( Здесь только потеря значимости )
( или 2 / --- один чёрт )
a + ( здесь --- переполнение )
против
a b +
-1 scaled
В первом случае должна быть пол. беск., если вдруг числа очень далеки,
во втором --- любая беск., если числа очень близки.
Далее что может быть нехорошего.
Если b большое, а а маленькое, то:
1) b-a = b и может быть округлено вниз;
2) a+b = b ... .
Если наоборот...
Лень полностью расписывать.
Я не вижу причин, чтобы порядок отличался от ожидаемого.
Единственное, это неравенство становится нестрогим.
a<= (a+b)/2 <= b.
---
...Я работаю антинаучным аферистом...
Но команда сравнения с нулём есть и округлить как надо никто не может помешать.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
state7401281
должны ли совпадать результаты _арефметических_ (+,-,/,*) вычислений с переменными типа double если используются разные компиляторы? (gcc и msvc)