⑴ c語言編譯提示#INF00
scanf ("%lf",&a);得改成scanf ("%f",&a);,因為a是float型。
當b>=a不成立時,while (b>=a)不執行,e還是初值0,後面的y=pow(e,-1);就產生了被0除錯誤,顯示#INF00。
⑵ 一個簡單的c語言程序,輸出-1.#IND00..不知道哪裡錯
進行浮點數編程時,如果沒有注意,常常會出現輸出類似 1.#IND, 1.#INF 或者 nan, inf 之類奇怪的輸出。這通常隱含了浮點數操作的異常。
特殊浮點數的含義
1.#INF / inf:這個值表示「無窮大 (infinity 的縮寫)」,即超出了計算機可以表示的浮點數的最大范圍(或者說超過了 double 類型的最大值)。例如,當用 0 除一個整數時便會得到一個1.#INF / inf值;相應的,如果用 0 除一個負整數也會得到 -1.#INF / -inf 值。
-1.#IND / nan:這個的情況更復雜,一般來說,它們來自於任何未定義結果(非法)的浮點數運算。"IND"是 indeterminate 的縮寫,而"nan"是 not a number 的縮寫。產生這個值的常見例子有:對負數開平方,對負數取對數,0.0/0.0,0.0*∞, ∞/∞ 等。
簡而言之,如果遇到 1.#INF / inf,就檢查是否發生了運算結果溢出除零,而遇到 1.#IND / nan,就檢查是否發生了非法的運算。
特殊浮點數的判斷
很多 C 庫都提供了一組函數用來判斷一個浮點數是否是無窮大或 NaN。int _isnan(double x) 函數用來判斷一個浮點數是否是 NaN,而 int _finite(double x) 用以判斷一個浮點數是否是無窮大。
你可能已經注意到了,上面兩個函數都是以下劃線開頭的,因此在可移植性上可能是存在問題的,那麼如何實現一個通用的判斷版本呢?首先,對於 Nan,可以用下面的代碼實現:
bool IsNumber(double x)
{
// 這里的比較操作看上去總是會得到 true
// 但有趣的是對於 IEEE 754 浮點數 NaN 來說總會得到 false!
return (x == x);
}
而下面的代碼可以判斷一個浮點數是否是有限的(finite, 即既不是 NaN 又不是 infinite):
bool IsFiniteNumber(double x)
{
return (x <= DBL_MAX && x >= -DBL_MAX);
}
其中,DBL_MAX 是 <float.h> 中預定義的常量。
把上面兩個函數結合起來,還可以實現一個浮點數是否是 Inf 的判斷。
⑶ c語言程序運行結果為什麼出現1.#INF00
是因為運算結果溢出。
解決辦法,例:
chara=126,則a+45=126+45=172-256=-85
uchara=2,則a-100=-98+256=158
a,b基本類型相同時,有符號與無符號數的轉換:
無符號a-->有符號b
if(a<max_count/2)b=a
elseb=a-[max_count]
有符號數a-->無符號數b
if(a>0)b=a
elseb=a+[max_count]
例1chara=-119;ucharb=a;則b=-119+256=137
例2uchara=137;charb=a;則b=137-256=-119
例3signedcharchr=127;
intsum=127;
chr+=10;
sum+=chr;
sum值是
思路先把chr當成無符號數,chr+=10變成137然後把chr轉化為有符號數137-256=-119-119+sum(127)=8
(3)c語言中inf00什麼意思擴展閱讀
溢出的原因,考慮兩個非負整數x和y,滿足0<=x,y<=(2^w)-1。xy可以被表示為w位無符號數字,然而考慮它們的和的話,我們可以得到0<=x+y<=2^(w+1)-2。這個和需要w+1位來表示。如果再用其他數加上這個結果的話,可能又將需要w+2,w+3位來表示新的結果。
這種持續的「字長膨脹「意味著,如果想要完整地表示算數運算的結果,就不能對字長做任何限制(實際上Lisp就是這樣乾的)。如果限制了數據類型的字長,溢出的發生是不可避免的。由於溢出後的結果往往不是想要的結果,必須對溢出時的情形另做處理,但在此之前我們必須得先能夠判斷什麼時候發生了溢出。
無符號整數的溢出判斷比較簡單:對一個字長w的無符號數加法運算,當x+y>=2^w時,第w+1位被程序捨去,相當於在x+y的和的基礎上減去了2^w。由於x,y<=(2^w)-1,所以有x+y<x(或者x+y<y)。
intuadd_ok(unsignedx,unsignedy){
unsignedsum=x+y;
returnsum>=x;
}
⑷ C語言運行結果中出現「1.#INF00」,為什麼
當你輸入的c,n值過大的時候,運算結果就會溢出(數據過大或過小超過計算機所能存儲的值。。。),就出現你說的那種情況了
你用0.5,0.2試試。。。
⑸ [記] C語言中的nan和inf
在數據處理輸入輸出時,可能遇到數據讀入空值(極大、極小)、運算中分母為0或0.0,對0取對數等操作。將產生nan或inf 。
nan:not a number, 表示 「無效數字」
INF:infinite,表示「無窮大」
超出浮點數的表示範圍(溢出)
⑹ C語言中INF和NAN是什麼意思
inf :infinity (linux) 等同於 #INF:infinity
(windows)
nan :not a
number 等同於
#IND:indeterminate (windows)
注意:1、inf一般是因為得到的數值,超出浮點數的表示範圍(溢出,即階碼部分超過其能表示的最大值);而nan一般是因為對浮點數進行了未定義的操作,如對-1開方。
2、nan==nan
結果是0或false,即不能和nan進行比較,和nan進行比較得到的結果總是false或0。所以可以用函數: int
isNumber(double d){return (d==d);}來判斷d是否為nan,若d是nan則返回0,否則返回非零值。
3、1.0/0.0等於inf,-1.0/0.0等於-inf,0.0+inf=inf;
4、對負數開方sqrt(-1.0)、對負數求對數(log(-1.0))、0.0/0.0、0.0*inf、inf/inf、inf-inf這些操作都會得到nan。(0/0會產生操作異常;0.0/0.0不會產生操作異常,而是會得到nan)
5、得到inf時就查看是否有溢出或者除以0,得到nan時就查看是否有非法操作。
6、C語言的頭文件<float.h>中,有定義的常量DBL_MAX,這個常量表示「能表示出來的最大的雙精度浮點型數值」。<float.h>中還有常量DBL_MIN,DBL_MIN表示可以用規格化表示的最小的正浮點數,但DBL_MIN並不是最小的正浮點數,因為可以用可以用非規格化浮點數表示的更小。可以用函數:int
isFiniteNumber(double d){return
(d<=DBL_MAX&&d>=-DBL_MAX);}來判斷d是否為一個finite數(既不是inf,又不是nan(加入d為nan,則d參加比較就會得到false(0)值))。
7、1.0/inf等於0.0。
8、inf是可以與其他浮點數進行比較的,即可以參與<=、>+、==、!=等運算。下面這幾個宏(用宏實現的,使用時跟函數的形式基本相同)是判斷一個表達式的結果是否為inf、nan或其他:
頭文件:include<math.h>
宏的用法(類似於函數原型):int fpclassify(x);
int
isfinite(x);
int
isnormal(x);
int isnan(x);
int isinf(x);
具體用法:
1、int
fpclassify(x)
用來查看浮點數x的情況,fpclassify可以用任何浮點數表達式作為參數,fpclassify的返回值有以下幾種情況。
FP_NAN:x是一個「not a number」。
FP_INFINITE: x是正、負無窮。
FP_ZERO: x是0。
FP_SUBNORMAL: x太小,以至於不能用浮點數的規格化形式表示。
FP_NORMAL: x是一個正常的浮點數(不是以上結果中的任何一種)。
2、int
isfinite(x)
當(fpclassify(x)!=FP_NAN&&fpclassify(x)!=FP_INFINITE)時,此宏得到一個非零值。
3、int
isnormal(x) 當(fpclassify(x)==FP_NORMAL)時,此宏得到一個非零值。
4、int
isnan(x) 當(fpclassify(x)==FP_NAN)時,此宏返回一個非零值。
5、int
isinf(x) 當x是正無窮是返回1,當x是負無窮時返回-1。(有些較早的編譯器版本中,無論是正無窮還是負無窮,都返回非零值,不區分正負無窮)。