Strictfp возвращает разные результаты в разных системах
Я использую следующий метод на Windows 8 (Intel Atom Z3775):
public static strictfp void main(String args[])
{
float a = 0.000000002f;
float b = 90000300000000004f;
float c = a * b;
System.out.println(c);
}
что дает мне: 1.80000592E8
При беге
public strictfp void calculate()
{
float a = 0.000000002f;
float b = 90000300000000004f;
float c = a * b;
Toast.makeText(getApplicationContext(), c + "", Toast.LENGTH_LONG).show();
}
я получаю: 1.8000059E8
Почему они отличаются? Я неправильно использую строгий фп?
2 ответа
Решение
Вы подтвердили, что печать шестнадцатеричного представления с плавающей точкой показывает, что значения одинаковы:
String.format("%08x", Float.floatToIntBits(c))
Это означает, что есть разница в реализации того, как float
превращается в String
,
Обратите внимание, что реализация OpenJDKjava.lang.Float.toString(float)
вызывает метод из sun.misc.FloatingDecimal
то есть это реализация, специфичная для JDK.
Вам понадобится либо:
- Чтобы вы всегда выполняли код, используя одну и ту же реализацию
- Обеспечить вашу собственную реализацию, которая всегда дает один и тот же результат
- Чтобы указать более короткий формат, чтобы строки были одинаковыми с таким количеством десятичных разрядов.