Iphone 使用双值计算时,何时会遇到问题?
想象一下,我写了一个简单的计算器应用程序,它只计算简单的东西,比如 1.5+30+9755-30-20000+999900.54 我还记得在使用浮点数时有一些精度问题。我的计算器应用程序在哪一点开始产生错误的结果?大多数时候,我只会计算像1+2-963422这样的整数,但有时我可能会输入一个浮点数。我不知道精度问题会从哪里开始起作用。就那个双倍的最后一个数字?比如-963419.0000000000003655?或者那会是什么样子?你知道怎么抓住那些吗 每次浮点计算都会出现浮点精度“问题” 有时候,你是幸运的,你处理的数字只涉及2:x.25、y.125等的幂。小数点右边的部分对于任何整数k都是1/(2^k) 如果您使用的任何值的小数位数不是二的幂,则会出现表示问题。1./3、1./5、1./6、1./7、1./9等 所有非2次方值都会出现浮点表示问题。每次浮点计算都会出现浮点精度“问题” 有时候,你是幸运的,你处理的数字只涉及2:x.25、y.125等的幂。小数点右边的部分对于任何整数k都是1/(2^k) 如果您使用的任何值的小数位数不是二的幂,则会出现表示问题。1./3、1./5、1./6、1./7、1./9等 所有非2次方值都会出现浮点表示问题。很难说“何时”,这取决于数字的大小、执行的操作次数以及所需的精度 有些语言支持特殊的对象/结构来处理精确的十进制运算。Java有BigDecimal:很难说“何时”,这取决于数字的大小、执行的操作数量以及需要的精度Iphone 使用双值计算时,何时会遇到问题?,iphone,math,precision,Iphone,Math,Precision,想象一下,我写了一个简单的计算器应用程序,它只计算简单的东西,比如 1.5+30+9755-30-20000+999900.54 我还记得在使用浮点数时有一些精度问题。我的计算器应用程序在哪一点开始产生错误的结果?大多数时候,我只会计算像1+2-963422这样的整数,但有时我可能会输入一个浮点数。我不知道精度问题会从哪里开始起作用。就那个双倍的最后一个数字?比如-963419.0000000000003655?或者那会是什么样子?你知道怎么抓住那些吗 每次浮点计算都会出现浮点精度“问题” 有时
有些语言支持特殊的对象/结构来处理精确的十进制运算。Java有BigDecimal:浮点数学充满了陷阱!以下是一些您应该注意的问题: 1) 添加非常大和非常小(绝对值)的数字。IEEE-754单精度浮点数的精度约为7位有效小数。所以如果你尝试 要计算1000000.0+3.14159,将丢失小数点后的大部分数字。 如果使用简单算法计算大型数组的运行和,则可能会发生这种情况 (数百万个小值)。要想找到更好的方法,请查看
2) 减去两个几乎相等的大数字也有类似的问题。结果可能只有一个或两个有效数字。同样,解决方案通常是以一种避免“减去两个大象得到一个鼠标”的方式重新安排计算。浮点数学充满了陷阱!以下是一些您应该注意的问题: 1) 添加非常大和非常小(绝对值)的数字。IEEE-754单精度浮点数的精度约为7位有效小数。所以如果你尝试 要计算1000000.0+3.14159,将丢失小数点后的大部分数字。 如果使用简单算法计算大型数组的运行和,则可能会发生这种情况 (数百万个小值)。要想找到更好的方法,请查看
2) 减去两个几乎相等的大数字也有类似的问题。结果可能只有一个或两个有效数字。同样,解决方案通常是以避免“减去两头大象得到一只鼠标”的方式重新安排计算。尝试
0.1+0.2-0.3尝试0.1+0.2-0.3
引用:
除了失去意义之外,
无法表示数字,例如
π和0.1精确,其他
不准确,以下现象
可能发生以下情况:
- 取消:几乎相等的操作数相减可能会导致极大的损失
精确性。这也许是最重要的
常见且严重的精度问题
- 转换为整数并不直观:将(63.0/9.0)转换为
整数产生7,但转换为
(0.63/0.09)可能产生6。这是
因为转换通常会截断
而不是圆形。地板和天花板
函数可能会产生
从直觉上看是一个接一个的
期望值
- 有限指数范围:结果可能溢出,产生无穷大,或
产生低于正常数值的下溢
或者零。在这些情况下,精度将提高
迷路了
- 安全除法的测试是有问题的:检查除数
不是零并不保证
分裂不会泛滥和屈服
无限
- 平等性测试是有问题的。两个计算
在数学上是连续的序列
平等很可能产生不同的结果
浮点值。程序员
经常在某些范围内进行比较
公差(通常为十进制常数,
本身没有准确地表示),
但这并不意味着
问题消失了
为了避免此类问题,您需要分析您的具体计算,以尽量减少。引用:
除了失去意义之外,
无法表示数字,例如
π和0.1精确,其他
不准确,以下现象
可能发生以下情况:
- 取消:几乎相等的操作数相减可能会导致极大的损失
精确性。这也许是最重要的
常见且严重的精度问题
- 转换为整数并不直观:将(63.0/9.0)转换为
整数产生7,但转换为
(0.63/0.09)可能产生6。这是
因为c