Iphone 使用双值计算时,何时会遇到问题?

Iphone 使用双值计算时,何时会遇到问题?,iphone,math,precision,Iphone,Math,Precision,想象一下,我写了一个简单的计算器应用程序,它只计算简单的东西,比如 1.5+30+9755-30-20000+999900.54 我还记得在使用浮点数时有一些精度问题。我的计算器应用程序在哪一点开始产生错误的结果?大多数时候,我只会计算像1+2-963422这样的整数,但有时我可能会输入一个浮点数。我不知道精度问题会从哪里开始起作用。就那个双倍的最后一个数字?比如-963419.0000000000003655?或者那会是什么样子?你知道怎么抓住那些吗 每次浮点计算都会出现浮点精度“问题” 有时

想象一下,我写了一个简单的计算器应用程序,它只计算简单的东西,比如

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:

很难说“何时”,这取决于数字的大小、执行的操作数量以及需要的精度


有些语言支持特殊的对象/结构来处理精确的十进制运算。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