Почему один и тот же код может давать разные числовые результаты на 32- и 64-битных машинах?

Мы работаем над библиотекой числовых процедур на языке C. Мы еще не уверены, будем ли мы работать с одинарной точностью (float) или двойной (double), поэтому мы определили тип SP в качестве псевдонима, пока не решим:

typedef float SP;

Когда мы запускаем наши модульные тесты, все они проходят на моей машине (64-битная Ubuntu), но не проходят на машине моего коллеги (32-битная Ubuntu, которая была ошибочно установлена на 64-битную машину).

Используя команду bisect Git'а, мы нашли точное различие, которое начало давать разные результаты на его машине и моей:

-typedef double SP;
+typedef float SP;

Другими словами, переход от двойной точности к одинарной дает численно разные результаты на наших машинах (примерно 1e-3 относительная разница в худшем случае).

Мы совершенно уверены, что нигде не сравниваем беззнаковые значения ints с отрицательными знаковыми значениями ints.

Почему библиотека числовых процедур может давать разные результаты на 32-битной операционной системе и на 64-битной?

КЛАРИФИКАЦИЯ

Боюсь, я не совсем ясно выразился: у нас есть Git commit 2f3f671, в котором используется двойная точность, и где модульные тесты проходят одинаково хорошо на обеих машинах. Затем у нас есть Git commit 46f2ba, где мы перешли на одинарную точность, и здесь тесты по-прежнему проходят на 64-битной машине, но не проходят на 32-битной.

6
задан lindelof 21 October 2011 в 09:24
поделиться