Я кодирую несколько эталонных алгоритмов на Java и C / C ++. Некоторые из этих алгоритмов используют & pi ;. Я хотел бы, чтобы две реализации каждого алгоритма выдавали идентичных результатов без округления по-разному. Один из способов сделать это, который до сих пор работал последовательно, - использовать пользовательскую константу pi
, которая в обоих языках одинакова, например 3.14159. Однако глупо определять pi, когда уже есть высокоточные константы, определенные в библиотеках Java и GCC.
Я потратил некоторое время на написание быстрых тестовых программ, просмотр документации для каждой библиотеки и чтение типов с плавающей запятой. Но я не смог убедить себя, что java.lang.Math.PI (или java.lang.StrictMath.PI) равен или не равен M_PI в math.h.
GCC 3.4.4 (cygwin) math.h содержит:
#define M_PI 3.14159265358979323846
^^^^^
но это
printf("%.20f", M_PI);
производит
3.14159265358979311600
^^^^^
, что говорит о том, что последние 5 цифр нельзя доверять.
Между тем, Javadocs говорят, что java.lang.Math.PI - это:
Значение double
, которое ближе, чем
любое другое пи , соотношение
окружность круга к его
диаметр.
и
public static final double PI 3.141592653589793d
, который опускает сомнительные последние пять цифр из константы.
System.out.printf("%.20f\n", Math.PI);
производит
3.14159265358979300000
^^^^^
Если у вас есть некоторый опыт работы с типами данных с плавающей точкой, можете ли вы убедить меня, что эти библиотечные константы в точности равны? Или что они точно не равны?