[问题] pow() powf() 算float算错?

楼主: la8day (la8day)   2015-05-09 01:37:19
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
MinGW g++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
我有天刚好需要算到98的5次方时,想说使用cmath/math.h的 pow()函式来运算
发现float的98^5竟然和double的98^5算出来不一样,直接差在整数位
可是后来去查,发现pow也有float的overloading呀
之后又试了powf(),发现结果还是一样错....用codepad跑过也是一样错...
后来又用了cmath和math.h都试了也是一样,不知是否是我误用?
如果是的话,要怎么正确对单精度浮点数作指数运算呢?
喂入的资料(Input):
98.0f的 5.0f 次方
预期的正确结果(Expected Output):
9039207968.000000
错误结果(Wrong Output):
9039208448.000000
程式码(Code):(请善用置底文网页, 记得排版)
http://codepad.org/sdqGxWaH
补充说明(Supplement):
详细就如codepad连结
作者: sunev (Veritas)   2015-05-09 01:40:00
你知道float精确到几位吗?
楼主: la8day (la8day)   2015-05-09 01:44:00
我有想过,可是我以为精确度问题只会出现在小数很后面有点难想像整数部分会差这么多
作者: azureblaze (AzureBlaze)   2015-05-09 01:59:00
你知道精度的定义吗
作者: prismwu   2015-05-09 02:01:00
wiki IEEE 754
作者: azureblaze (AzureBlaze)   2015-05-09 02:03:00
_.________*10^(+/-)__ 这个格式塞你的答案下去差多少
楼主: la8day (la8day)   2015-05-09 02:06:00
抱歉我确实觉得有点问题 但好像还没抓到造成这样差异的点98 = 1.53125 * 2^6 , 5 = 1.25 * 2^2在经过反复运算后 mantisa的部分误差已经太大?OK我搞懂了 感谢azureblaze大...我顺便复习了一下754我以前好像误解ieee 754的设计只会差在小数点 冏
作者: LPH66 (-6.2598534e+18f)   2015-05-09 05:28:00
IEEE754 就只是二进制科学记号表示法, 跟我们熟知的十进制科学记号表示法除了进位不同外其他方面都是一样的所以一些计算上的误差性质也是一样的就像我们写 6.02*10^23 不表示精确度到得了个位数
作者: Killercat (杀人猫™)   2015-05-10 22:49:00
float的老问题了,这在3D图学是个很常见的雷float精度其实完全不看小数点的 只看有效位数

Links booklink

Contact Us: admin [ a t ] ucptt.com