整數

整數

如果比例尺不為零,則使用%進行計算,例如3%2和46%4,往往會輸出0。

bc
scale=10
print 4%3   // output 0

答案1

命令手冊關於 BC 如何計算模數的說明如下:

表達式的結果是“餘數”,其計算方式如下。要計算 a%b,首先a/b計算以縮放數字。此結果用於計算a - ( a/b ) * b到scale+scale(b)和scale(a)中的最大值的比例。如果小數位數設定為零且兩個表達式都是整數,則該表達式是整數餘數函數。


編輯: 我查看了 GNU BC 的源代碼,發現 mod 運算子擴展了除法運算符。換句話說,模數是作為除法的副積計算的。它依靠整數除法來計算模數。設定時scale,但不發生整數除法。

在 BC 試試看:

bc
scale = 0
print 5/2

scale = 5
print 5/2

你應該得到:

2        << Integer Division
2.50000  << NOT integer division!

現在讓我們像 BC 一樣代入這些數字。說明書上說用的是a-(a/b)*b計算。讓我們代入兩個結果,一個是整數除法的結果,另一個是非scale0 的結果。

a - ( a/b ) * b
5 - ( 2   ) * 2  = 1  << CORRECT!
5 - ( 2.5 ) * 2  = 0  << VERY WRONG!

沒有整數除法:

a - ( a/b ) * b == a - (  a  ) == 0

這就是為什麼必須將比例設為 0 才能使模數正常工作。
這個問題似乎源自於 BC 的設計以及它如何以「比例」處理數字。為了使模數正確工作我們需要整數除法

其他很多更先進的工具為此目的,它們是免費且開源的,我建議您使用它們。

答案2

user272970的回答很好。這是對其的一個調整:

define int(x) { auto oldscale; oldscale=scale; scale=0; x=x/1; scale=oldscale; return( x ); }
define fmod(x,y) { auto oldscale; oldscale=scale; scale=1000; x = x - y * int(x/y); scale=oldscale; return( x ); }

這(使用auto oldscale)使oldscale函數成為本地函數。如果沒有這個,從 fmod() 中oldscale進行的設定將覆蓋嘗試保存在 中的,將設定保留為 1000 而不是呼叫之前的任何內容。int()oldscalefmod()scalefmod()

我將這些函數加入~/.bcrc並將環境變數BC_ENV_ARGS設為~/.bcrc.每次運行 bc 時都會載入這些函數。所以現在我可以fmod(x,y)在 bc 中隨時運行,而不必每次都手動定義這些函數。

在大多數情況下,1000 的psscale可能有點過大

答案3

我是這樣解決的:

整數

定義 int(x) { oldscale=scale;比例=0; x=x/1;比例=舊比例;返回(x); }

模數

定義 mod(x,y) { oldscale=scale;規模=1000; x = x - y * int(x/y);比例=舊比例;返回(x); }

華泰

答案4

正如其他答案所說,這是定義a%b為 的結果(a-(a/b)*b),在當前 處評估scale。這意味著如果您希望它充當整數模數,則需要將其與 一起使用scale=0

但我不同意這是“錯誤的”。它是一個潛在有用的工具,特別是對於評估錯誤。

scale=5
1/3
> .33333
1%3
> .00001

7/13如果我們用 4 位小數表示,我們會失去什麼.5384

scale=4
7/13
> .5384
7%13
> .0008

顯然0.0008/13

最後,因為它不堅持使用整數,所以它可以用來提取小數的一部分。

scale=1
123.456/1
> 123.4
123.456%1
> .056

相關內容