M_PI
От: Аноним  
Дата: 18.08.14 07:37
Оценка: +2 -1 :))
Раньше в math.h были константы типа M_PI, M_E etc., их можно было использовать определив макрос _USE_MATH_DEFINES. Например в msvc 2010 это прекрасно работает.
Решил собрать проект используя mingw 4.8.2, оказалось что это не работает. В инете пишут что якобы эти константы не входят в стандарт и предлагают какую-то хрень вроде 4 * std::atan(1) или определить свою константу. Это конечно можно, но что делать если в куче сторонних библиотек это M_PI используется?
И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?
Re: M_PI
От: jazzer Россия Skype: enerjazzer
Дата: 19.08.14 15:32
Оценка: 14 (2) +1 :)
Здравствуйте, Аноним, Вы писали:

А>И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?


С++14, глава 14, стих 1:
template<class T> constexpr T pi = T(3.1415926535897932385);

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: M_PI
От: icWasya  
Дата: 21.08.14 05:47
Оценка: 35 (2) :)
Здравствуйте, 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) был точно равен нулю.
Re: M_PI
От: watchyourinfo Аргентина  
Дата: 18.08.14 07:43
Оценка: -2
А>И почему вообще в стандарте не определены фундаментальные математические константы, которые гораздо фундаментальнее чем весь язык С++ вместе взятый?

эти константы в float/double точно все равно не представимы.

А их приближения уже не обладают той фундаментальностью, о которой ты гойворишь.
Так зачем их включать??
Re: Boost
От: Qbit86 Кипр
Дата: 18.08.14 07:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В инете пишут что якобы эти константы не входят в стандарт и предлагают какую-то хрень вроде 4 * std::atan(1) или определить свою константу.


Если используется Boost: http://www.boost.org/doc/libs/1_56_0/libs/math/doc/html/math_toolkit/constants.html
Глаза у меня добрые, но рубашка — смирительная!
Re: M_PI
От: ivanzoid Россия https://zoid.cc
Дата: 18.08.14 09:56
Оценка:
Здравствуйте, Аноним, Вы писали:

Использовать хидеры от C (не C++)? Макосевский man M_PI сообщает, что последний входит в стандарт C99.
Re[2]: M_PI
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.08.14 10:03
Оценка:
Здравствуйте, ivanzoid, Вы писали:

I>Использовать хидеры от C (не C++)? Макосевский man M_PI сообщает, что последний входит в стандарт C99.


Не входит. Проверено по тексту стандарта. И в C11 не входит.
The God is real, unless declared integer.
Re[3]: M_PI
От: ivanzoid Россия https://zoid.cc
Дата: 18.08.14 10:09
Оценка:
Здравствуйте, netch80, Вы писали:

N>Не входит. Проверено по тексту стандарта. И в C11 не входит.


А, ну понятно, я видимо неправильно прочитал фразу "The <math.h> functions and macros conform to the ISO/IEC 9899:2011 standard." (видимо имеется ввиду, что, то что определено — соответствует стандарту) из https://developer.apple.com/library/prerelease/mac/documentation/Darwin/Reference/ManPages/man3/M_PI.3.html

Ну, тогда можно сделать банально

#ifndef M_PI
#define M_PI ...
Re: M_PI
От: Figaro Россия  
Дата: 18.08.14 13:58
Оценка:
Может наименование дефайна _USE_MATH_DEFINES или самих констант запатентованы
avalon/1.0.433
Re[3]: M_PI
От: Кодт Россия  
Дата: 25.08.14 09:08
Оценка:
Здравствуйте, 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 и т.п.?

Вообще, логично выглядит, что абсолютная ошибка в ковырнадцатом знаке (ошибка представления плавающего числа) аргумента синуса даёт абсолютную ошибку примерно в том же ковырнадцатом знаке результата.
Перекуём баги на фичи!
Re[2]: M_PI
От: Кодт Россия  
Дата: 25.08.14 09:16
Оценка:
Здравствуйте, 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>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.