float型別最大值和最小值
1.瞭解float儲存結構
float儲存結構請看另一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875
2.float最大值
float結構如下圖:
要想獲得正最大值,那就令符號位為0,指數位和尾數位全為1,則應該是最大會是,最大值應該為:
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
則float型別十六進位制表示為:0x7fff ffff
以下是測試程式碼:
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0xff;
*(p+1)=0xff;
*(p+2)=0xff;
*(p+3)=0x7f;
printf("\n&a=%x",&a);
printf("\na=%f",a);
}
結果並不和我們想的一樣,出現了1.#QNAN0,這個我也不知道為什麼,知道原因的可以回覆!
如果指數位最後一位為0,則是我們想要的結果,
我們知道float最大為(2-2^-23)*2^127= 3.4028234663852886*10^38
見float.h
#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
當我們令指數位為:1111 1110 =254 則指數為254-127=127
尾數位全為1,則最大數為1.11111111111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
則十六進位制表示為:0x7f7f ffff
3.測試程式碼:
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0xff;
*(p+1)=0xff;
*(p+2)=0x7f;
*(p+3)=0x7f;
printf("\n&a=%x",&a);
printf("\na=%f",a);
}
我們從結果可以看出
&a=12ff44
a=340282346638528860000000000000000000000.000000
a=340282346638528860000000000000000000000.000000
這是float的最大值
4.float正最小值
float.h中我們看到float正的最小值為
1.175494351e-38F
#define FLT_MIN 1.175494351e-38F /* min positive value */
通過了解float型別的結構我們知道如何才能獲得正的最小值,要獲得正的最小值,我們只要將指數位置成最小及0000 0000 則指數為0-127=-127,然後將尾數位最後一位置1,其它置0
及十六進位制為0x0000 00001
5.測試程式碼
void main(int argc, char* argv[])
{
float a=-8.25;
char *p=(char*)&a;
*p=0x01;
*(p+1)=0x00;
*(p+2)=0x00;
*(p+3)=0x00;
printf("\n&a=%x",&a);
printf("\na=%e",a);
}
我們得到的結果為 1.00000000 00000000 0000 01*2^-127= 5.877472454760670*10^-039,可是結果不是我們預測的!不知道為什麼
如果將指數位置成1,測試程式碼如下:
void main(int argc, char* argv[])
{
float a=-8.25;
float b=0;
char *p=(char*)&a;
*p=0x01;
*(p+1)=0x00;
*(p+2)=0x80;
*(p+3)=0x00;
printf("\n %d ",sizeof(a));
printf("\n&a=%x",&a);
printf("\na=%e",a);
}
我們看到結果為 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,這是我們想要的結果!
相關文章
- int float double 各型別的最大值最小值型別
- C/C++_int/float/double的最大值和最小值C++
- C/C++——求下面資料型別的最大值和最小值: char, short, int, long, float, double, long double和numeric_limits使用C++資料型別MIT
- JavaScript 陣列最大值和最小值JavaScript陣列
- JavaScript 陣列 最大值和最小值JavaScript陣列
- JavaScript陣列最大值和最小值JavaScript陣列
- 2419 求最大值和最小值
- JavaScript獲取陣列最大值和最小值JavaScript陣列
- JavaScript陣列中的最大值和最小值JavaScript陣列
- c++ 基本資料型別(int、float、double、long、long long)最大值,最小是表示方法C++資料型別
- decimal(numeric )、float 和 real 資料型別的區別Decimal資料型別
- 關於MYSQL中FLOAT和DOUBLE型別的儲存MySql型別
- Float型別*100的坑 (BigDecimal 的使用)和float形的格式化型別Decimal
- 7-1 最大值和最小值 (10分)__C++C++
- PHP基礎-資料型別-floatPHP資料型別
- java double、float型別的比較Java型別
- JavaScript可以設定最大值和最小值的隨機數JavaScript隨機
- js獲取陣列元素中的最大值和最小值JS陣列
- 同時找到最大值和最小值——程式設計之美程式設計
- 型別長度大於最大值型別
- 最大值減不為0的最小值
- 尋找陣列中的最大值和最小值O(1.5*N)陣列
- JavaScript 專題之如何求陣列的最大值和最小值JavaScript陣列
- JavaScript陣列最大值、最小值和平均數JavaScript陣列
- js獲取陣列的最大值和最小值程式碼例項JS陣列
- 數字之魅:尋找陣列中的最大值和最小值陣列
- JAVA 求出一個一維int型陣列的元素最大值、最小值、平均值、和所有元素之和Java陣列
- float和double有什麼區別?
- c語言中%f輸出double型和float型值C語言
- 【PL/SQL】IEEE浮點型別BINARY_FLOAT和BINARY_DOUBLESQL型別
- 求陣列之和,最小值,最大值,平均值陣列
- C++11獲取double型別的最大最小值C++型別
- 演算法求陣列中的最大值最小值演算法陣列
- Linux中awk命令正確的求最大值、最小值、平均值、總和Linux
- js獲取數字陣列中的最大值和最小值程式碼例項JS陣列
- python中分辨int和float的差別Python
- decimal,float和double的區別是什麼?Decimal
- PHP 對 float 型別使用 JSON_encode () 精度缺失PHP型別JSON