C C 中實型和整型之間運算所產生的精度問題

2021-10-17 05:09:37 字數 1852 閱讀 6928

總結在一道 「求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....