Я пишу код на разных языках, который включает арифметику с двойной точностью. В идеале программы должны давать точно такие же значения. Я знаю, что не все двойные/float-арифметики детерминированы (объясняется здесь красиво: https://randomascii.wordpress.com/2013/07/16/floating-point-determinism/), поэтому мне нужно быть осторожным. Может кто-нибудь объяснить, что здесь происходит, хотя ?:Нечеткое совпадение между C и Java
программы C:
#include <stdio.h>
#include <stdlib.h>
int
main(void) {
printf("%.52f\n", 1.66007664274403694e-03);
return (EXIT_SUCCESS);
}
Результат: 0.0016600766427440369430584832244335302675608545541763
"Эквивалент" Java 8 программ:
class A {
public static void main(String args[]) {
System.out.printf("%.52f\n", 1.66007664274403694e-03D);
}
}
Результат: 0.0016600766427440370000000000000000000000000000000000
Результаты разные. У меня такое ощущение, что это может быть связано с режимами округления с плавающей запятой, однако, насколько я вижу, C и Java имеют одинаковые значения по умолчанию (?).
Как я могу обеспечить, чтобы обе программы имели одинаковый результат?
EDIT:
FWIW, если я печатаю константа как BigDecimal: System.out.printf("%.52f\n", new BigDecimal(1.66007664274403694e-03));
, я получаю: 0.0016600766427440369430584832244335302675608545541763
. Это может доказать, что это не проблема отображения, но кто знает, какая магия JVM делает под ним.
EDIT2:
Использование strictfp
, как @ Крис-к предполагает, я аннотированный класс, а результат остается 0.0016600766427440370000000000000000000000000000000000
.
EDIT3:
Другое предложение попробовать System.out.printf("%.52f\n", new BigDecimal("1.66007664274403694e-03"));
, что дает результат, который мы еще не видели: 0.0016600766427440369400000000000000000000000000000000
.
Число округлено на 18-м месте после десятичного знака, а не на большом вопросе. – ameyCU
вы можете использовать 'BigDecimal' для более точных вычислений в java – Andrew
Да, я мог бы использовать BigDecimal за счет эффективности, но поскольку стандартизированы парные номера, как получается несоответствие? –