Java parsefloat одинаковый результат на каждом процессоре - PullRequest
2 голосов
/ 30 октября 2019

Я только что прочитал о strictfp (https://en.wikipedia.org/wiki/Strictfp) и тот факт, что операции с плавающей / двойной точкой могут давать разные результаты на разных процессорах, начиная с Java 1.2.

Теперь мне интересно, верно ли то же самое дляFloat.valueOf метод? Я не могу найти источник этого. Javadoc для valueOf прямо заявляет, что:

Note that the round-to-nearest rule also implies overflow and underflow behaviour;

Что для меня означает, что оно может отличаться, если строгий fp выключен.

Есть ли источник, который является точным по этой теме и утверждает, что это так или нет?

1 Ответ

4 голосов
/ 30 октября 2019

Что для меня означает, что оно может отличаться при отключении strictfp.

JLS говорит, что значение модификатора strictfp заключается в том, что любые выражения внутри класса илиметод оценивается как FP-строгий.

Однако JLS не говорит, что если вы вызываете другой метод в выражениях со строгим FP, то вычисления в этом методе также автоматически строго FP.

Это означает, что результат, полученный вами при вызове Float.valueOf, не зависит от strictfp / строгости FP вызывающего абонента.

Обратная сторона (внутренний) Java-класс, который выполняет преобразование в Float.valueOf(String):

  • , использует специальные значения для значений INF и NaN,
  • обеспечивает, чтобы значение находилось в пределах ошибки. границы, установленные в javadoc, и
  • в случае Float, он выполняет преобразование в double арифметике.

Однако метод преобразования не является strictfp метод, поэтому, если код чувствителен к строгости FP, то возникнет проблема.

Класс для поиска - jdk.internal.math.FloatingDecimal в Java 11.

...