2013-07-02 1 views
2

вместо правильного ответа 0, когда я бегу (экоса 1) в, чтобы найти арккосинус 1 Emacs, я получить ответПочему в Common Lisp, когда я запускаю функцию acos с аргументом 1, ответ неверен?

-6.125742f-17

почему это и как я могу получить правильный ответ от 0, как калькулятор Windows, говорит, что это должно быть

Я использую SBCL как мой интерпретатор Лиспа на Windows 8 и SBCL является 32-BIT

, когда я бегу:

(acos (rational 1))

я получить тот же ответ, и когда я бегу

(acos (float 1))

я получаю эту ошибку

The value -6.1257422745431e-17 
is not of type 
    (DOUBLE-FLOAT 0.0 3.141592653589793). 
    [Condition of type TYPE-ERROR] 
+0

Если у вас есть вопросы по SBCL, лучше спросить в списке рассылки поддержки SBCL. –

+0

@RainerJoswig Это не SBCL-специфический. Точность плавающей точки влияет на все языки. Пример: http://stackoverflow.com/questions/2670999/how-can-i-work-around-the-fact-that-in-c-sinm-pi-is-not-0 – finnw

+4

@finnw: есть упомянутое конкретное условие ошибки SBCL, значение отчета об ошибке. Плюс: другие реализации CL, например SBCL на моем Mac, вычислить (acos (float 1)) до 0.0. –

ответ

10

Принятая ответ sin(M_PI) is not 0 применим и здесь:

Вы необходимо прочитать What Every Computer Scientist Should Know About Floating-Point Arithmetic и понять, что все вычисления с плавающей запятой являются приблизительными и приближение к вам получил «достаточно хорошо».

Что касается ошибки SBCL, вы должны report it to the SBCL maintainers.

+3

user2368426: Если ответ помог вам, вы должны его принять. Вы задали 13 вопросов, получили ответы на многие из них и не приняли их. Дайте кредит там, где это необходимо – Baggers