Раньше в math.h были константы типа M_PI, M_E etc., их можно было использовать определив макрос _USE_MATH_DEFINES. Например в msvc 2010 это прекрасно работает.
Решил собрать проект используя mingw 4.8.2, оказалось что это не работает. В инете пишут что якобы эти константы не входят в стандарт и предлагают какую-то хрень вроде 4 * std::atan(1) или определить свою константу. Это конечно можно, но что делать если в куче сторонних библиотек это M_PI используется?
И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?
Здравствуйте, Аноним, Вы писали:
А>И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?
С++14, глава 14, стих 1:
template<class T> constexpr T pi = T(3.1415926535897932385);
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?
J>С++14, глава 14, стих 1: J>
J>template<class T> constexpr T pi = T(3.1415926535897932385);
J>
J>
Кстати, в одной старой библиотеке, на одной старой ЭВМ,
где тригонометричеческие функции вычислялись програмно,
были три константы Pi для вычислений сразной точностью.
Специально подобраные так, что бы Sin(Pi) был равен нулю.
Потому что если написать Sin128(3.14159265358979323856264338327951288197),
то получалось не ноль, а где-то 1e-19, а Sin128(Pi128) был точно равен нулю.
Здравствуйте, Аноним, Вы писали:
А>В инете пишут что якобы эти константы не входят в стандарт и предлагают какую-то хрень вроде 4 * std::atan(1) или определить свою константу.
Здравствуйте, icWasya, Вы писали:
W>Кстати, в одной старой библиотеке, на одной старой ЭВМ, W>где тригонометричеческие функции вычислялись програмно, W>были три константы Pi для вычислений сразной точностью. W>Специально подобраные так, что бы Sin(Pi) был равен нулю. W>Потому что если написать Sin128(3.14159265358979323856264338327951288197), W>то получалось не ноль, а где-то 1e-19, а Sin128(Pi128) был точно равен нулю.
А Sin128(Pi128*2) или Sin128(Pi128/2) чему был равен? Или на этот случай было предусмотрено Pi128_half, Pi128_twice и т.п.?
Вообще, логично выглядит, что абсолютная ошибка в ковырнадцатом знаке (ошибка представления плавающего числа) аргумента синуса даёт абсолютную ошибку примерно в том же ковырнадцатом знаке результата.
Здравствуйте, jazzer, Вы писали:
J>С++14, глава 14, стих 1: J>
J>template<class T> constexpr T pi = T(3.1415926535897932385);
J>
Нет ли здесь срезки? Например, захотели взять pi<long double>, а по факту, скормили компилятору литерал типа double (без суффикса L), компилятор лишние незначащие разряды немедленно забыл ещё на стадии лексического анализа!!!
Я уже молчу про такое издевательство, как pi<int> (в каком там соединённом штате был соответствующий закон?) или pi<string>