存儲精度
『壹』 matlab中的存儲精度。
默認為64位浮點,double
其他數據類型還有:
logical -- Logical array
char -- Character array
single -- Single precision floating-point numeric array
float -- Double or single precision floating-point numeric array
int8 -- 8-bit signed integer array
int16 -- 16-bit signed integer array
int32 -- 32-bit signed integer array
uint32 -- 32-bit unsigned integer array
int64 -- 64-bit signed integer array
integer -- An array of any of the 8 integer classes above
numeric -- Integer or floating-point array
cell -- Cell array
struct -- Structure array
『貳』 為什麼用%g存儲的小數有變化
這涉及到兩個方面的問題:
①電腦對浮點數(float)的表述。32位對浮點數的表達是:0~22位=尾數;23~30是指數,31位則是符合位。說白了就是十進制的小數部分是按照1/2+1/4+1/8+....這樣的方式去逼近的,因此存在誤差,也就是所謂的{存儲精度}的問題。上面的121.6234其實電腦中的16進制數是:0x42f33f2e,再轉換回10進制≈121.62339782714844,不同的編譯器在不同的機器上,還有些許的誤差。因此雖然文件中是121.6234,但讀取到電腦內存中時按二進制或16進制存儲,在printf時,按格式又轉換,因此二者之間存在轉換誤差。
②%f和%g的區別。不帶控制長度的%f,只表示6位精度(即小數點後面),因此%f≈121.623398,而%g則是{最多}6位(有效位含小數點前後),因此%g≈121.623。
而%.9g則表示最多有效位9位,這個處理是在0x42f33f2e(121.62339782714844)這個數基礎上作的取捨,≈121.623398(...78四捨五入)。
也正是這個原因,高精度浮點運算有專門的庫。
③ 可以用double替代float提高精度。因為在電腦中,double是64位,尾數部分有52位表示,11位指數位和1個符號位構成。121.6234 = 1.216233978271484375E2 = 0x405E67E5C91D14E4,因此更逼近121.6234. 演示代碼如下:
#include<stdio.h>
intmain(intargc,charconst*argv[])
{
floata=121.6234;
doubled=121.6234;
printf("%.9g%f ",a,a);
printf("%.9g%f ",d,d);
return0;
}
運行:
121.623398121.623398
121.6234121.623400
數據類型的長度是存儲數據所佔用的位元組數,指的是物理存儲空間大小。
精度是指最多可以存儲的十進制數字的總位數,包括小數點左邊和右邊的位數。
『肆』 C語言中單精度數據的存儲范圍,求高手指點啊
單精度存儲首先最高位是符號位。
然後有8位的指數位。代表
2^-127
~
2^128
(存儲時
127代表
2^0
255代表2^128
0為
2^-127)
後面的23位是尾數即小數位。沒有整數,在存儲時會移好位,使的整數為1,如2
會存成
1*2^1
這樣,1.9999*2^128
大約為
6.8*10^38
雙精度的指數部分為11位,2^-1023~2^1024
最大能存大約
3.595*10^308