kest |
|
Темы:
10
Сообщения:
79
Участник с: 18 января 2010
|
с каких пор вот такой код:#include <cmath> #include <iostream> int main(int argc, char** argv) { std::cout << sin(M_PI/2) << '\n' << cos(M_PI/2) << '\n'; return 0; } выводит вот такое: $ ./cos с каких пор косинус от пи/2 не равен нулю? |
amigo |
|
Темы:
35
Сообщения:
2126
Участник с: 05 февраля 2007
|
Обычное дело для вычислительной техники. Округлять надо :)
Разберемся, голубчик!
|
kest |
|
Темы:
10
Сообщения:
79
Участник с: 18 января 2010
|
я, конечно, понимаю, что надо округлять. Но интересует вопрос, нафига нужна ВМ если она даже табличные значения с погрешностью вычисляет. и что странно, на C++ и на паскале косинус вычисляется неправильно… точнее правильно, но не совсем. откуда погрешность? я же пишу не 3,14 а с системной константой у которой точность довольнотаки высока… странно всё это. Интересно, это у всех так? |
shaman |
|
Темы:
26
Сообщения:
379
Участник с: 13 декабря 2009
|
пи - число иррациональное и в комп ты его ну никак не вобьешь, только приближение. и косинус считается не от пи пополам, а от приближения пи пополам. минус 17 степень достаточно малое число, если тебе нужен ноль, введи число эпсилон - нужная точность и сравнивай с ним результат, если он меньше эпсилон, то обнуляй. и вдогонку, по этой же причине если нужна точность я не сравниваю дробные числа друг с другом как есть, а использую эпсилон, и проверяю уже пересечения эпсилон-окрестностей чисел. |
h4tr3d |
|
Темы:
34
Сообщения:
2656
Участник с: 12 июля 2007
|
Еще могу сказать, что ещё во многих числодробилках типа octave, scilab столкншся с этим “не нулями”, для себя просто принимай - они ноль. Числодробление идет всегда с конечной точностью, нужно точнее - maxima и ему подобное, библиотек для Си не подскажу (не было такой задачи) Вот примеры: Octave octave:1> cos(pi/2) ans = 6.1230e-17 octave:2> eps ans = 2.2204e-16 octave:3> help eps `eps' is a built-in function -- Built-in Function: eps -- Built-in Function: eps (X) -- Built-in Function: eps (N, M) -- Built-in Function: eps (N, M, K, ...) -- Built-in Function: eps (..., CLASS) Return a scalar, matrix or N-dimensional array whose elements are all eps, the machine precision. More precisely, `eps' is the relative spacing between any two adjacent numbers in the machine's floating point system. This number is obviously system dependent. On machines that support IEEE floating point arithmetic, `eps' is approximately 2.2204e-16 for double precision and 1.1921e-07 for single precision. When called with no arguments, return a scalar with the value `eps(1.0)'. Given a single argument X, return the distance between X and the next largest value. When called with more than one argument the first two arguments are taken as the number of rows and columns and any further arguments specify additional matrix dimensions. The optional argument CLASS specifies the return type and may be either "double" or "single". Достаточно внятно про твою проблему сказано в справке, с отсылкой к источникам стандартов :) SciLab -->cos(%pi/2) ans = 6.123D-17
systemd должен умереть.
|