Я кодирую несколько эталонных алгоритмов как в Java, так и в C/C++. Некоторые из этих алгоритмов используют π. Я хотел бы, чтобы две реализации каждого алгоритма производили идентичные результаты, без округления по-разному. Один из способов сделать это, который работал до сих пор, состоит в использовании настраиваемой константы pi
, которая точно такая же на обоих языках, например, 3.14159. Однако мне кажется глупо определять pi, когда есть уже высокоточные константы, определенные как в библиотеках Java, так и в GCC.Является ли java.lang.Math.PI равным M_PI 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
^^^^^
Если у вас есть некоторый опыт в типы данных с плавающей точкой, вы можете убедить меня, что эти библиотеки констант в точности равны? Или что они определенно не равны?
В C вы можете сделать двойной pi = M_PI; printf ("% lld \ n", pi); для получения того же 64-битного целого числа: 4614256656552045848 –
Спасибо Бруно, что в значительной степени отвечает на исходный вопрос. – JeeBee