關(guān)于C語(yǔ)言除0引發(fā)的思考
<SPAN style="BACKGROUND-COLOR: rgb(241,254,221)">
<SPAN style="FONT-FAMILY: Microsoft YaHei">
進(jìn)行浮點(diǎn)數(shù)編程時(shí),如果沒(méi)有注意,常常會(huì)出現(xiàn)輸出類似 1.#IND, 1.#INF 或者 nan, inf 之類奇怪的輸出。這通常隱含了浮點(diǎn)數(shù)操作的異常。
</SPAN></SPAN>
進(jìn)行整數(shù)除0的時(shí)候,程序會(huì)檢查出一個(gè)錯(cuò)誤,比如對(duì)于這個(gè)代碼:
#include <stdio.h>
#include <math.h>
int main()
{
int m;
m=1/0;
printf("%d",m);
return 0;
}
運(yùn)行完以后程序就會(huì)警告:warning: division by zero [-Wdiv-by-zero]
但是對(duì)于浮點(diǎn)數(shù),就沒(méi)有類似的檢查:
#include <stdio.h>
#include <math.h>
int main()
{
double m;
m=1.0/0.0;
printf("%lf",m);
return 0;
}
不會(huì)有警告或者報(bào)錯(cuò),但是運(yùn)行完以后會(huì)出現(xiàn)這樣的值:-1.#IND00,不知所云。于是上網(wǎng)查了一下,原來(lái)是這樣!
特殊浮點(diǎn)數(shù)的含義
1.#INF / inf:這個(gè)值表示“無(wú)窮大 (infinity 的縮寫(xiě))”,即超出了計(jì)算機(jī)可以表示的浮點(diǎn)數(shù)的最大范圍(或者說(shuō)超過(guò)了 double 類型的最大值)。
例如,當(dāng)用 0 除一個(gè)整數(shù)時(shí)便會(huì)得到一個(gè)1.#INF / inf值;相應(yīng)的,如果用 0 除一個(gè)負(fù)整數(shù)也會(huì)得到 -1.#INF / -inf 值。 -1.#IND / nan:這個(gè)的情況更復(fù)雜,一般來(lái)說(shuō),它們來(lái)自于任何未定義結(jié)果(非法)的浮點(diǎn)數(shù)運(yùn)算。"IND"是 indeterminate 的縮寫(xiě),而"nan"是 not a number 的縮寫(xiě)。產(chǎn)生這個(gè)值的常見(jiàn)例子有:對(duì)負(fù)數(shù)開(kāi)平方,對(duì)負(fù)數(shù)取對(duì)數(shù),0.0/0.0,0.0*∞, ∞/∞ 等。 簡(jiǎn)而言之,如果遇到 1.#INF / inf,就檢查是否發(fā)生了運(yùn)算結(jié)果溢出除零,而遇到 1.#IND / nan,就檢查是否發(fā)生了非法的運(yùn)算。
特殊浮點(diǎn)數(shù)的判斷
很多 C 庫(kù)都提供了一組函數(shù)用來(lái)判斷一個(gè)浮點(diǎn)數(shù)是否是無(wú)窮大或 NaN。int _isnan(double x) 函數(shù)用來(lái)判斷一個(gè)浮點(diǎn)數(shù)是否是 NaN,而 int _finite(double x) 用以判斷一個(gè)浮點(diǎn)數(shù)是否是無(wú)窮大。
你可能已經(jīng)注意到了,上面兩個(gè)函數(shù)都是以下劃線開(kāi)頭的,因此在可移植性上可能是存在問(wèn)題的,那么如何實(shí)現(xiàn)一個(gè)通用的判斷版本呢?
首先,對(duì)于 Nan,可以用下面的代碼實(shí)現(xiàn):
bool IsNumber(double x)
{
// 這里的比較操作看上去總是會(huì)得到 true
// 但有趣的是對(duì)于 IEEE 754 浮點(diǎn)數(shù) NaN 來(lái)說(shuō)總會(huì)得到 false!
return (x == x);
}
而下面的代碼可以判斷一個(gè)浮點(diǎn)數(shù)是否是有限的(finite, 即既不是 NaN 又不是 infinite):
bool IsFiniteNumber(double x)
{
return (x <= DBL_MAX && x >= -DBL_MAX);
}
其中,DBL_MAX 是 <float.h> 中預(yù)定義的常量。
把上面兩個(gè)函數(shù)結(jié)合起來(lái),還可以實(shí)現(xiàn)一個(gè)浮點(diǎn)數(shù)是否是 Inf 的判斷。
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文