[浮點型數據]數值精度&取值范圍 完全不同的概念


先來看個小程序:

#include <stdio.h>
int main()
{
    double a = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796;
    //這里的a是千位的pi
  if (a == 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796) {
        printf("相等\n");
    }
    else {
        printf("不相等\n");
    }
    printf("%.30f\n", a); //這里為了保證a輸出小數點后30位
    return 0;
}

 

運行結果為:

相等
3.141592653589793115997963468544

 

顯然a是可以取到千位pi,畢竟pi只是在3.14與3.15之間,這個數值當然在雙精度浮點型的所能表示的范圍內.所以不會出現錯誤. 但如果把"3."去掉,會顯示1415926535897932384....超過double的取值范圍

 

另一個問題是:如果我們仔細看運行結果3.141592653589793115997963468544

會發現只有加粗的16位數字是准確的,后面的部分都是不准確的.

所以對應我們知道的,double的有效數字一般有15-16位,其余部分都是不准確的.

 

同樣的可以測試float:

#include <stdio.h>
int main()
{

    float a = 3.14159265;
    if (a == 3.14159265) {
         printf("相等\n");
    }
    else {
        printf("不相等\n");
    }
    printf("a = %.30f\n", a);
    return 0;
}

 

運行結果為

不相等
a = 3.141592741012573242187500000000

我們會發現,結果是不相等,雖然我們讓a取了3.14159265,但是在計算機內部中卻是運行結果里出現的a = 3.1415927410125732421875;

運行結果里a = 3.141592741012573242187500000000

只有加粗的7位是准確的,對應知道的:float類型的數據只有7-8位是有效的,其余是不准確的.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM