LINUX.ORG.RU

gcc проблемы с вещественной арифметикой


0

0

Начали вылазить какие-то странные вещи. Есть некая переменная типа
double, к ней постоянно прибавляется вещественное число из диапазона [0..1]. Современем получается nan. Решается проблема тупым созданием неиспользуемой переменной.
Вот так получается nan:
x += delta;
А так всё хорошо:
double someVar;
x += delta;
Но после этого следующее по коду вещественное выражение становится nan.
У меня сложилось мнение что компилятор неправильно вычисляет адрес.
Может кто сталкивался с таким? Кстати на 64-ой машине всё хорошо.
Версия gcc на 32-ной машине 3.4.3 и 4.0.0.
Но глюк проявляется только в одной довольно большой программе, писал маленький main там всё хорошо.

Да ещё, проверял valgrind-ом - ошибок нет.

TaranSergey
() автор топика
Ответ на: комментарий от Dark_SavanT

Переменная находится в union который сидит в класе являющимся элементом хеша и выделяемым по new так, что мне с трудом вериться, что она в регистр попадает. Но всё же volatile дописал - тестирую..

TaranSergey
() автор топика
Ответ на: комментарий от anonymous

Если бы дело было в перезатерании, то не помогалобы введение левых переменных. Кстати проставил volatile - не помогло..

TaranSergey
() автор топика
Ответ на: комментарий от TaranSergey

как вариант можно было бы поставить отлов nan
по isnan(3)/fpclassify(3)/finite(3) и дальше изменять delta
и продолжать суммирование.

hyde
()
Ответ на: комментарий от TaranSergey

>Если бы дело было в перезатерании, то не помогалобы введение левых переменных.

Покажи описание типа. Лучше 2 варианта - с и без левой переменной.

anonymous
()

Встречался с похожим поведением. Язык и платформа были другими - общее только "большая программа" и "значение испорчено". В том случае данные выделялись в куче, запоминался указатель на данные, данные реаллоцировались - и при записи по запомненному указателю ломалось что-то другое. В тот раз помогла установка break-point-а на изменение значения.

Но, с другой стороны, непонятно как влияет неиспользуемый someVar. Могу только высказать предположение, что если x размещается в стеке, то где-то указатель на локальную переменную функции используется после выхода из функции. Во забубенил-то :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.