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.

Вам понадобится либо:

  • Чтобы вы всегда выполняли код, используя одну и ту же реализацию
  • Обеспечить вашу собственную реализацию, которая всегда дает один и тот же результат
  • Чтобы указать более короткий формат, чтобы строки были одинаковыми с таким количеством десятичных разрядов.

Ну, способ отображения, конечно, отличается...

Другие вопросы по тегам