※ 本文轉寄自 ptt.cc, 文章原始頁面
看板Math
標題

[其他] 電腦浮點數實作兩函數問題

時間
留言107則留言,7人參與討論
推噓20 ( 20087 )
想請問一下如圖這兩個函數f跟g如何化簡讓電腦的誤差最小 https://www.desmos.com/calculator/sjxxpwsfwt 其中f(x) = (2^x-(x+1))/(x(x-1)), 0<=x<=1 g(x) = (x^2+1-2^x)/(x(x-1)), 0<=x<=1 可以看到當x越接近0或是1時, f跟g都會遇到0/0的問題, 很吃浮點數的精度 但是由數學理論值可以知道這兩邊的極限值都存在 因此感覺可以化簡成一個讓電腦可以不用面臨極端值運算的形式 嘗試過把2^x做泰勒展開, 但是後續無窮項還是面臨項數問題... 再請板友幫忙, 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.102.225.191 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Math/M.1689697741.A.853.html

107 則留言

jchin, 1F
在x=0或1, 分子分母取微分?

yhliu, 2F
當遇到分母為 0 或絕對值低於某值,檢查分子是否亦

yhliu, 3F
接近 0, 如是,則 x 代以另一近似值計算之;否則ERR

yhliu, 4F
分子分母微分法的好處是此例只要 x 靠近 0 或 1 都

yhliu, 5F
能得到正確結果。而上面我提出的方法好處是適用一般

yhliu, 6F
0/0 不定式,而不需改函數式,缺點一當然在此例就是

yhliu, 7F
x 靠近 0 或 1 會遇到除以 0 或溢值問題,另外就是

yhliu, 8F
結果也許不精確,例如第一個函數在 x<=0.1e9 時開始

yhliu, 9F
不正確。
謝謝j大跟y大的idea, 感覺不管微分還是近似值計算, 都還是要決定一個threshold? 即大於某個threshold採取原式, 小於某個threshold採取近似式? 原本是不想要有這個"tunable parameter", 但是目前看起來只能這樣了QQ 好像跟偽逆矩陣一樣, 多小的eigenvalue視作0, 否則視作倒數

j0958322080, 10F
試試 bug number algo.

j0958322080, 11F
bug-->big
謝謝j大關鍵字

simonjen, 12F
你可以自己寫一個運算用字串去存

LPH66, 13F
樓上那就是上面提的 big number (大數) 演算法
我查big number algorithm沒看到特指哪一種算法, 以及s大說的"用字串去存"指的是什麼 有Reference可以提供嗎? 謝謝!

PPguest, 14F
我估狗搜尋一下,看起來是指用其他方法如字串,陣列來

PPguest, 15F
存例如100位有效數字的數

LPH66, 16F
大數的基本概念就是這樣沒錯, 用大陣列去模擬小學時

LPH66, 17F
做基本加減乘除的演算法

LPH66, 18F
例如 GMP (GNU 多重精度運算庫) 就是一個用 C 語言

LPH66, 19F
寫的這類型函式庫
喔喔 意思就是多開buffer去存更多資料就是了?

j0958322080, 20F
不一定要字串,你也可以開個 int64_t 再注意進位

wohtp, 21F
f(x)在 x = 0 附近改寫一下

wohtp, 22F
f(x) = -1/(x-1) + (exp(x ln 2) -1)/x * 1/(x-1)

wohtp, 23F
主要問題是 (exp(x ln 2) -1)/x 這項

wohtp, 24F
我不知道你用什麼,但是大部分函式庫應該都有expm1

wohtp, 25F
改用這個就不會有誤差問題
嗨w大, 第一次看到expm1, 然後查一下還有logp1來增加精度的case, 我再參考, 謝謝!

wohtp, 26F
f(x)拆成兩截,x<0.5的時候用這個,另一頭改用y = 1

wohtp, 27F
-x 當變數,然後expm1比照辦理
了解~

wohtp, 28F
傷浮點精度的是大數相減剩小數,不是0/0
f(x)/g(x)時, 假設數學上是lim_{x→0}f(x) = lim_{x→0}g(x) = 0 且lim_{x→0} f(x)/g(x) = 1 我就是怕x→0時, f跟g這兩個函數在library上的精度不同, 或是函數本身遞增速率不同 導致某個很小的x代入g(x)時, 如果電腦已經因為精度問題return true 0 但是f(x)還沒, 那f(x)/g(x)就是+inf 反之如果是f(x)先return true 0, 那f(x)/g(x)就是+0 我就是怕以上這種情況才會問這篇, 還是說這個並不會發生?

PPguest, 29F
原來有expm1(筆記)

PPguest, 30F
想請問一下,若想知道實際誤差的狀況,準確的計算值要

PPguest, 31F
如何得到?

wohtp, 32F
這個問題不就是「怎麼讓數值運算更精確」

wohtp, 33F
開100位浮點數去算啊,不然還能怎樣?

wohtp, 34F
喔對了,回到原po的問題,x = 0 or 1的時候要直接讓

wohtp, 35F
函數給極限值,所以其實需要四個case
我真實要應用的case是(1,0), (s,log_2(s)), (p,log_2(p)), (2,1) 然後1, s, p這三個可能都相等, 可能都相異, 可能兩個相等 然後我去觀察圖形時哪個case, 都還是三次多項式 因此要拆的段數, 要算的極限值好多...

wohtp, 36F
所以你的函數最複雜就log?那你怕什麼?

wohtp, 37F
這些常見的函數實作精度大概都逼近machine precisio

wohtp, 38F
n。

wohtp, 39F
你給的例子裡面,精度直落的唯一原因是大數相減,完
這個舉例理解~謝謝P大~

LPH66, 133F
初次接觸浮點數運算的話冼鏡光老師這篇可以看看

LPH66, 134F
blog.dcview.com/article.php?a=Az0HYgNrBDU%3D

LPH66, 135F
包含了我們這裡提過的跟一些其他也很重要的運算概念
謝謝L大的reference~
※ 編輯: znmkhxrw (59.102.225.191 臺灣), 07/25/2023 01:53:08