C ++余弦问题

时间:2009-09-21 17:20:07

标签: c++ math

我使用C ++获得以下代码:

double value = .3;
double result = cos(value);

当我在本地窗口中查看“值”的值时,它显示为0.2999999999

然后,当我得到“结果”的值时,我得到:0.95533648912560598

然而,当我在计算机计算器上运行cos(.3)时,我得到:.9999862922474

很明显,我做错了。

有关可能导致结果差异的原因的任何想法?

我在Intel处理器上运行Win XP。

由于

6 个答案:

答案 0 :(得分:20)

结果的差异是因为:

您的计算机的计算器返回以度为单位指定的角度的余弦值。 C ++ cos()函数返回以弧度指定的角度的余弦。

.2999999999是由于计算机中处理浮点数的方式。 .3不能完全用双精度表示。有关详细信息,建议您阅读What Every Computer Scientist Should Know about Floating Point Arithmetic.

答案 1 :(得分:10)

cos(.3弧度)= 0.95533 ...

cos(.3度)= 0.99998 ......

答案 2 :(得分:4)

cos(0.3)= 0.99998629224742679269138848004408使用度

使用弧度

cos(0.3)= 0,95533648912560601964231022756805

答案 3 :(得分:3)

  

当我在本地窗口中查看“值”的值时,它显示为0.2999999999

长话短说,你的计算器使用十进制算术,而你的C ++代码使用二进制算术(double是一个二进制浮点数)。十进制数0.3不能完全表示为二进制浮点数。阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,这将更详细地解释所有含义。

答案 4 :(得分:2)

您的计算器正在使用学位。例如:

>>> import math
>>> math.cos (.3)
0.95533648912560598
>>> math.cos (.3 * math.pi / 180)  # convert to degrees
0.99998629224742674

答案 5 :(得分:2)

C ++并不能准确表示浮点数,因为获得无限精度所需的存储量非常大。有关此演示,请尝试以下操作:

double ninth = 1.0/9.0;
double result = 9.0 * ninth;

这应该产生.99999999999

的结果值

因此,实质上,您需要比较小epsilon中的浮点值(我倾向于使用1e-7)。您可以进行严格的逐位比较,但这包括将浮点使用的内存转换为长度为sizeof(float)的字符数组,然后比较字符。

要检查的另一件事是你是否使用学位。计算机的计算器使用度数进行余弦计算(注意计算器的结果是.99999 ...,非常接近1.零的余弦是1),而< math>中提供的余弦函数。是弧度。尝试将您的值乘以PI / 180.0,看看结果是否更符合您的预期。