Мы работаем над библиотекой числовых процедур на языке 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-битной.