浮點數相關

2021-08-19 20:16:05 字數 1735 閱讀 3906

浮點數(float,double) 精度問題與巨集定義(#define)

float(單精度) double(雙精度)

位元組        4                8

32位            64位

float型別所占用4個位元組則會有32位,而在儲存時,系統會將實型資料分成小數部分和指數二個部分來儲存。由於小數也存在正負,最前面的單獨一位來表示符號位。0表示正數。1表示負數。當然,這種時採取的時十進位制儲存資料。

我們知道9的二進位制表示為1001,所以4bit能精確十進位制中的1位小數點,24bit就能使float能精確到小數點後6位,同理:double型別資料能精確到小數點後15位。對於指數部分,因為指數可正可負,8位的指數字能表示的指數範圍就應該為:-127-128了,所以指數部分的儲存採用移位儲存,儲存的資料為元資料+127

在計算機中使用二進位制的方法來儲存資料:怎麼表示呢?將十進位制的資料轉化為二進位制儲存

符號位+指數字+尾數字

float         1           8         23

double      1         11        52

符號位依然為   0表示正數   1表示負數  

8.25,用二進位制的科學計數法表示為:1000.1->1.0001*2^3

符號位為:0,表示為正,指數字為:3+127=130 ,位數部分為,故8.25的儲存方式如下圖所示:

精度問題:可以巨集定義的方式來定義精度,

表示誤差時,比如誤差範圍+-0.01,真實的距離x,合理的範圍是y

x-0.01<=y&&y<=x+0.01

巨集定義(#define):我們在書寫長長的程式時,當我們要對其中的乙個數進行修改時,我們不可能把程式中的此資料逐個找出來進行修改,這時候,便有了巨集定義(#define)

例:求ax^2+bx+c=0的解的情況

因為浮點數的表示會存在一些誤差,所以應該用eps來定義誤差的範圍,使得結果較為準確

#include

#include

#include

#define eps 0.000001

void fun(double a,double b,double c)

double x1;

double x2;

double d = b*b - 4*a*c;

//if(a == 0)//error

if(-eps<=a &&ax1 = x2 = -c/b;

printf("x1=%f,x2=%f\n",x1,x2);

else //a != 0

if(-eps<=d&& d<=eps)//d==0

x1=x2=-b/(2*a);

printf("x1=%f,x2=%f\n",x1,x2);

else

if(d > eps)

x1 =(-b+sqrt(d))/(2*a);

x2 =(-b-sqrt(d))/(2*a);

printf("x1=%f,x2=%f\n",x1,x2);

else //d<0

printf("無實根\n");

int main()

fun(0,1,2);

fun(1,2,1);

fun(1,4,2);

fun(1,1,1);

return 0;

浮點數相關

剛剛看了別人的部落格裡關於浮點數的講解,我用通俗的話總結一下 以浮點數9.0為例子,用二進位制表示為1001.0,科學記數公式為 1 num 1 s m 2 e s表示符號,e表示階乘,m表示有效數字 簡單來說就是s填0或者1來決定正負,e表示小數點要移位的次數,m表示1.001也就是有效數字,基本...

浮點數相關

4 下面的程式會輸出什麼?include int main 參 該項程式輸出如下所示,0 12 1095237632 原因是 浮點數是4個位元組,12.5f 轉成二進位制是 01000001010010000000000000000000,十六進製制是 0x41480000,十進位制是 109523...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...