跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 让人困惑的浮点精度和误差
未分類
15 1 月 2021

让人困惑的浮点精度和误差

让人困惑的浮点精度和误差

資深大佬 : sillydaddy 6

计算机的浮点数只有有限精度,浮点运算会损失精度,我就遇到了一个例子:
已知 A,B 两点坐标分别为(10000000.0, 0, 0), (10000000.0, 0.001, 0),求 AB 线段的长度。
解法 1: 直接求向量 A-B=(0,0.001,0)的长度,得到结果是 0.001
解法 2: 由于 A 、B 和原点 O 构成直角三角形,使用勾股定理,使用|AO|*|AO| – |BO|*|BO| = |AB|*|AB|,求得|AB|是 0
其中,解法 2 由于在大数的乘法运算后,再做减法运算,导致损失了精度。

那么,现在我想解二次方程 a*x*x+b*x+c=0 的根:
用求根公式:x1,2=(-b±Δ)/(2*a),其中Δ=sqrt(b*b-4*a*c)
公式里面有浮点数的乘法,加减法,除法,所以比照上面举的例子,这里应该也会损失精度。

那么损失的精度是多少呢?
我注意到,方程系数 a,b,c 的值可以等比例放大,不影响理论上的计算结果,那么可以通过放大 a,b,c 的值,让经过运算后的浮点结果更精确吗?

大佬有話說 (6)

  • 資深大佬 : shintendo

    浮点精度看有效数字,你放大也没用吧

  • 資深大佬 : walsh

    FLT_EPSILON DBL_EPSILON
    详情《数值分析》

  • 資深大佬 : agagega

    浮点数的误差很多来自两点:
    1. 有效数字不同,也就是大数和小数做运算的时候。因为做运算的时候要把指数对齐,所以理论上你放大还是不放大没有什么区别
    2. 一些数在二进制里无法精确表示

  • 資深大佬 : tonyrft

    如果真的想要高精度用计算机代数系统就行了

  • 資深大佬 : vivoapex

    参考《深入理解计算机系统》,我花了两周才把整数和浮点数搞定

  • 資深大佬 : UN2758

    不能,由于 IEEE754 规定的尾码长度有限,遇到无法用 2 的 n^-1 表示的数时,误差就一定存在,你的放大操作是放大了阶码,没用

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具