2016-04-14 10 views
0

Я использую следующий метод на Windows 8 (Intel Atom Z3775):Strictfp возвращает разные результаты на разных системах

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(); 
} 

i get: 1.8000059E8

Почему они отличаются? Я использую strictfp неправильно?

+0

Что произойдет, если вы напечатаете 'String.format («% 08x », Float.floatToIntBits (c))' вместо этого в обоих случаях? –

+0

Они возвращают точно такую ​​же строку. Использование Float.toString (c) для преобразования в String на обеих формах не помогает. – Geosearchef

+0

Вправо - поэтому фактические цифры побитообразны. Существует просто разница в реализации алгоритма для превращения float в строку. –

ответ

1

Вы подтвердили, что печать шестигранного представления поплавков показывает, что значения одинаково:

String.format("%08x", Float.floatToIntBits(c)) 

Это означает, что существует разница в реализации способа преобразования float в String.

Обратите внимание, что OpenJDK implementation of java.lang.Float.toString(float) вызывает метод от sun.misc.FloatingDecimal - то есть это реализация, специфичная для JDK.

Вы должны были бы либо:

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

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

+0

И что меняет что? Теперь я добавил «+» «» в System.out.println(), и теперь оба поплавка сначала преобразуются в строку перед передачей методу. – Geosearchef

+0

Очевидно, что преобразование с плавающей точкой в ​​строку также может отличаться. –

+0

Как я могу это исправить? – Geosearchef

Смежные вопросы