總結在一道 「求n個分數相加,分離出整數部分和小數部分」 的題中,嘗試把n個分數之和轉化為double型資料,分離整數部分和小數部分,再利用遍歷找到小數部分對應的分數。邏輯關係正確,卻始終有bug,經過逐行檢查,加之詢問學長,最終發現了問題出現於實型和整型之間產生的精度問題。
下面案例可供參考
以下**為提取出來的部分。
**如下(示例):
#include
intmain()
編譯運算後:
a =
0.333333333333333260000000000000
b =0.333333333333333260000000000000
c =0.333333333333333310000000000000
由此可以得出:double 與 整型 之間的運算會產生誤差 。
**如下(示例):
#include
intmain()
編譯運算後:
a =
0.333333343267440800000000000000
b =0.333333343267440800000000000000
c =0.333333343267440800000000000000
由此可以得出:float 與 整型 之間的運算不會產生誤差 。
3.1. double 與 類似於(1.0/3.0)之間的運算
**如下(示例):
#include
intmain()
編譯運算後:
a =
0.333333333333333310000000000000
b =0.000000000000000000000000000000
由此可以得出:double 與 類似於(1.0/3.0)之間的運算不會產生誤差 。
3.2. float 與 類似於(1.0/3.0)之間的運算
**如下(示例):
#include
intmain()
編譯運算後:
a =
0.333333343267440800000000000000
b =0.000000009934107758624577400000
由此可以得出:double 與 類似於(1.0/3.0)之間的運算會產生誤差 。
3.3. ** float 與 類似於(1.0/3.0)之間的運算誤差的產生
誤差值為 3.2 中的 b :0.000000009934107758624577400000
初步觀察得:3.2 中 float 型 a 與 3.1 中 double 型 a 的差值接近於誤差的值。
驗證**如下(將 float a 的小數部分和 double a 的小數部分都化為 長整型 來運算):
#include
intmain()
編譯運算後:
993410749
//與誤差值相等
由此可以得出:在運算中類似於(1.0/3.0)的部分會自動轉化為double型。
float型和double型資料的儲存方式
double 與 整型 之間的運算會產生誤差 。
float 與 整型 之間的運算不會產生誤差 。
在運算中 類似於(1.0/3.0)的部分會自動轉化為double型。
整型常量和實型常量
整型常量和實型常量 1 整型常量 在 c 語言中,整型常量分為十進位制整型常量 八進位制整型常量和十六進製制整型常量三 種表示形式。1 十進位制整型常量 這種常量只能出現 0 9 的數字,且可帶正 負號。例如 0 1 364 28 34 2 八進位制整型常量 這種常量是以數字 0 開頭的八進位制數字...
C C 中的整型常識
很多人對c c 中的整型不太了解,導致 移植的時候出現問題,本人在此總結一下 a.c c 對整型長度的規定是為了執行效率,將int定義為機器字長可以取得最大的執行速度 b.c c 中整型包括 int,char 和 enum,c 中還包含bool型別,c99中bool是乙個巨集,實際為 bool c....
C C 中的整型常識
很多人對c c 中的整型不太了解,導致 移植的時候出現問題,本人在此總結一下 a.c c 對整型長度的規定是為了執行效率,將int定義為機器字長可以取得最大的執行速度 b.c c 中整型包括 int,char 和 enum,c 中還包含bool型別,c99中bool是乙個巨集,實際為 bool c....