我使用C ++获得以下代码:
double value = .3;
double result = cos(value);
当我在本地窗口中查看“值”的值时,它显示为0.2999999999
然后,当我得到“结果”的值时,我得到:0.95533648912560598
然而,当我在计算机计算器上运行cos(.3)时,我得到:.9999862922474
很明显,我做错了。
有关可能导致结果差异的原因的任何想法?
我在Intel处理器上运行Win XP。
由于
答案 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,看看结果是否更符合您的预期。