1. 程式人生 > >警惕C++中整數除法計算的精度損失

警惕C++中整數除法計算的精度損失

很偶然發現了一個精度損失的問題,簡單來說:

有表示式: l = i/30 + j/40 + k/25, 求當{i,j,k} = {50,85,27}時l的值,很簡單,用計算器馬上可以算出答案為4.8717,但是編寫了以下程式來實現:

int i = 50,j = 85, k = 27;

double l = i/30 + j/40 + k/25;

執行後,結果顯示4.000000000!

     為什麼?這是因為在C++中兩個整數相處得到的結果還是整數,故除法都被四捨五入了再相加,就得到結果4.00000了。也許你會說,這種小兒科的問題我不會犯,當然情況是這樣的時候很容易看出來,也比較容易避免,可是當i,j,k都是類的三個整數型別成員的時候,經常容易忘了他們是整數型別的,而寫出上述表示式。所以,在寫程式時,上述型別的式子要統一寫成:

int i = 50,j = 85, k = 27;

double l = i/30.0 + j/40.0 + k/25.0;

     這樣就不會出錯了。

     呵呵,這是早就應該知道的問題了,到現在才發現,不過也為時不晚,fighting~ O(∩_∩)O~


相關推薦

警惕C++整數除法計算精度損失

很偶然發現了一個精度損失的問題,簡單來說: 有表示式: l = i/30 + j/40 + k/25, 求當{i,j,k} = {50,85,27}時l的值,很簡單,用計算器馬上可以算出答案為4.8717,但是編寫了以下程式來實現: int i = 50,j = 85

C#除法運算符與VB.NET除法運算符

字母 ant width eve png per -h ado.net 如果 VB.NET中的除法運算符有兩個:/(浮點除法)、\(整數除法) C#中的除法運算符只有一個:/(除法) VB.NET中的除法運算符與 C#中的除法運算符 存在很大的差異,使用時註

C除法,商和余數的大小、符號如何確定

spa 匯編碼 來看 div 最大整數 () 以及 有時 取余 對於C中的除法,商和余數的大小、符號是如何確定的呢?在C89中,只規定了如果兩個數為正整數,那麽余數的符號為正,並且商的值是接近真實值的最大整數。比如5 / 2,那麽商就是2,余數就是1。但是,C89裏面對於被

js 中將string轉化為double,避免產生多位數和計算精度損失

整理一下,在寫js程式碼時,我們經常會因為帶有小數的運算而頭痛。因為它會出現產生多位數和計算精度損失。 在Java程式碼中我們可以有以下3種方式轉化 parseFloat("123.2") pars

js的小數計算精度問題,修正計算精度

js 的精度問題這個網上比較多,進行加減乘除運算也難免,常見的比如: 1)在控制檯 輸入:1.1+0.3 運算結果是:1.4000000000000001,根本原因也就是二進位制和十進位制轉換的問題,具體源由參考網上相關文章,有一種解決辦法:兩個數分別剩10的N次方最後再除10的N次方,比如:(

java解決double計算精度不準確問題

現象: 因需要對比投資成功前與投資成功後前後的剩餘金額的斷言,在斷言的時候發現針對double型別計算時會出現精度計算問題: 例如使用程式碼如下: 如上圖會因精度導致斷言失敗。 最後使用 DecimalFormat 類將數字進行格式化,程式碼如下: Decimal

C#自定義高精度Timer定時器的實例教程

edm 想要 精確 方式 mes 監視 工具 討論 etime Timer 用於以用戶定義的事件間隔觸發事件。Windows 計時器是為單線程環境設計的,其中,UI 線程用於執行處理。它要求用戶代碼有一個可用的 UI 消息泵,而且總是在同一個線程中操作,或者將調用封送到另一

C++的時間計算

在跑程式的過程中經常需要計算某個業務運行了多久,檢視是哪個部分所佔的時間比較長,之前一直用gettimeofday()函式,但那個比較麻煩,還需要用結構體,然後從中取各個時間,今天突然發現boost提供了一個直接可用且更方便的庫(好吧今天才知道不要嘲笑我) 為

C++星期幾計算公式

蔡勒公式(Zeller):是一個計算星期的公式。 隨便給一個日期,就可以使用這個公式推算出事星期幾。 公式如下:Weeks = [C/4] - 2C + y + [y/4] + [13*(M +1)/5] + d -1; 或者是Weeks = y + [y/4] + [c/

c++常用的計算程式執行時間的方法

方法1: 計時函式是clock(),而與其相關的資料型別是clock_t(標頭檔案是time.h)。函式定義原型為:clock_t clock(void); 這個函式返回從“開啟這個程式程序”到“程式中呼叫clock()函式”時之間的CPU時鐘計時單元(clock t

C++獲得CPU高精度時間戳( 納秒級 )

對關注效能的程式開發人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程式元件幫助程式設計師精確的控制程式程序,又是一件有力的除錯武器,在有經驗的程式設計師手裡可以儘快的確定程式的效能瓶頸,或者對不同的演算法作出有說服力的效能比較。  在Windows平臺下,常用

JAVAdouble型別計算精度控制

偶遇一個問題,進行如下計算 public class Demo {  public static void main(String[] args) {   int i = 1;   double d = i*0.005;   System.out.println(d);  

C 解決動態計算表達式的問題 如字符串 Sin 1 +Cos 2 執行並得出結果

翻譯 tro res min dsm ram 文件 edit 很好 分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net 前一陣公司老總要求我去重構一個同事

java的數學計算(大整數,小數計算精度

BigInteger:可以實現大整數計算構造方法:BigInteger(String val)注意:尋常Integer是有著明確的數字上限的,它的數值上限是2147483647。因此,如果需要表示超過此數的值,則應該使用BigInteger作為資料型別。BigInteger做

C++sizeof(struct)怎麽計算?(轉)

color 發現 pre blank str io7 bsp com 說明 struct為空時,大小為1. 1、 sizeof應用在結構上的情況 請看下面的結構: 1 struct MyStruct 2 { 3 double dda1; 4 char dda; 5 int

Java的高精度整數和高精度小數

整數測試 div string pac 高精 int trac print log 在實際編碼中,會遇到很多高精度的事例,比如,在計算金錢的時候就需要保留高精度小數,這樣計算才不會有太大誤差: 在下面的代碼中,我們驗證了,當兩個float型的數字相加,得到的結果和我們的預期

C# 的單精度與雙精度區別

數字 字節數 1.7 oat 處理 round col ble 浮點 單精度浮點數(float)與雙精度浮點數(double)的區別: (1)在內存中占有的字節數不同 * 單精度浮點數在機內占4個字節 *雙精度浮點數在機內占8個字節 (2)有效數字位數不同 *單精度浮點數有

C#float的取值範圍和精度分析

windows系統 weight 3.5 ans adding 發生 mage 深入 wid 本文實例分析了C#中float的取值範圍和精度。分享給大家供大家參考。具體分析如下: float類型的表現形式: 默認情況下,賦值運算符右側的實數被視為 double。 因此

java,js小數計算精度誤差問題

sys OS 時有 無限 小數 java sdn 符號位 ava   在碰見這個問題之前我完全沒有這個概念,碰見了特此記錄;   項目js裏面中用到了number*0.2(其中number是一個整數,我測試的時候是259),得到的結果卻是51.800000000000000

C#計算時間差

小時 tick ise 基本 returns times log title string 問題: startTime = DateTime.Now; -----------slExecutedTime.Text = (DateTime.Now -