關於浮點數有效數字我有很多疑惑,我發現我讀入一個浮點數後再輸出,兩個數字是不相等的。開始我以為是我輸入的數字超過了float有效數字位數的原因,但是下面這個程序證明不是這個原因:
#include <stdio.h>
#include <float.h>
int main(void)
{float test;
char data[7];
printf("Float has at least %d effective numbers\n", FLT_DIG);
printf("Then i'm gonna check it!\n");
printf("test data:_______\b\b\b\b\b\b\b");
scanf("%f",&test);
printf("please input again to confirm it:_______\b\b\b\b\b\b\b");
scanf("%s",&data);
printf("So %f is supposed to be %s", test, data);
return 0;
}
就是先查了一下我的機子規定float至少幾個有效數字,然後輸入一個數字,輸兩邊,一次存成float,一次存成字符串,最後檢驗float是不是真有這麼多有效數字
結果:
這是怎麼回事啊……我大概知道為什麼會有這種情況,就是計算機把十進制轉二進制存儲再轉十進制的過程出了問題……可是明明是機器告訴我有至少六位有效數字,那我輸個六位有效數字的數不應該會出錯的吧?
不知道哪位朋友能給我解答一下……是程序寫錯了嗎?還是說有效數字的問題我理解錯了?怎麼樣能讓數值准確的輸出呢?按照這種情況,豈不是大部分的運算的都是不准確的?
float數據 機器內是2進制數,
1位符號位
8位指數位
23位“尾數”位
共32 位 2進制數。
平時講 有效數字 是6~7位 ,指10進制。
通常程序輸入的數是10進制,進入機器後要化成2進制,計算完又轉十進制輸出。
10進制到2進制,2進制到10進制 轉換,有的數化不淨,有的數化得淨。
如同10進制分數化10進制小數,有的化得淨(例如 4分之1,變0.25),有的化不淨(例如 3分之1,變0.33333....)。
10進制到2進制,2進制到10進制 轉換,化得淨的效數字7位,化不淨的效數字6位,因為最後一位有捨入誤差。
例如:
float x,y;
x=0.51; // 化不淨
y=0.5; // 化得淨
printf("x=%.8f y=%.8",x,y); // 輸出 0.50999999 0.50000000