c語言isnan
① 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。(有些較早的編譯器版本中,無論是正無窮還是負無窮,都返回非零值,不區分正負無窮)。
② C語言題目:求正弦函數值。
你要把o=2*n+1放在循環內部。你的程序中o始終是個系統默認的值,而且應該是個很大的負數。
③ 輸出y無定義 如何用C語言編程
y 是否無定義,可以用 isnan(y) 判斷。
MS VC++ 編譯器 用 _isnan(y) 判斷。
函數原型 是 int _isnan( double x ); 需要頭文件 #include <float.h>
自己編程,當y無定義 時 輸出字元串 NaN
NaN 意思是 Not a Number. 例如 0.0 除以 0.0 , 無窮 除以 無窮 得 NaN。
④ 誰會用C++寫個類似isnan()和isinf()的函數
第一:C++沒有無窮大的概念,通常取表示上限為無窮大,所以根本就沒辦法判斷一個浮點數到底是不是無窮大,只能根據實際情況考慮。通常這個應該參考c/c++的limits頭文件。
第二:C++是強類型的語言,只要可以確定是浮點數的那必然是浮點數,就是不是,他也會變成浮點數,不可能是非數字,而且isnan並不是非數字的意思,而是不是一個有意義的數學結果的意思雖然它是不是一個數字的縮寫。因為對於C++這種可以操縱內存的語言來說,無論什麼數據都是內存位表示的,只對於解釋方法有意義,比如你聲明了一個int變數,然後強制轉換成一個void指針都行。
⑤ C語言:模擬簡單運算器的工作:輸入一個算式(沒有空格),遇等號 "=" 說明輸入結束,輸出運算結果。
#include<stdio.h>
voidmain()
{
charoperator0=0;
intoperand1=0, res=0;
printf("計算器運算如下:");
for(;;)
{
scanf("%d",&operand1);//輸入第一個數,並賦值給總和
res=operand1;
while(operator0!='=')
{
scanf("%c",&operator0);
if(operator0=='=')break;//如果輸入'=',馬上終止循環
scanf("%d",&operand1);
if(operator0=='+')
{
res=res+operand1;
}
elseif(operator0=='-')
{
res=res-operand1;
}
elseif(operator0=='*')
{
res=res*operand1;
}
elseif(operator0=='/')
{
res=res/operand1;
}
}
printf("%d ",res);
break;
}
}
/*簡化了一下,不知道這樣可不可以
getchar()可以獲取一系列字元,但換行後只讀取第一個
operator是C++中關鍵字,不能使用吧
循環中if和elseif一起使用要好點吧,
求採納!
*/
⑥ 簡單c語言,為什麼1/x處錯誤
進行浮點數編程時,如果沒有注意,常常會出現輸出類似
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語言,位運算與要輸出的數據之間的關系
船或浮體6自由度運動中的3個轉動運動。
橫搖(繞x轉動運動): DW_IMU_ROLL = 1 << 2, 二進制 100,十進制 4
縱傾(繞y轉動運動):DW_IMU_PITCH = 1 << 3, 二進制 1000,十進制 8
縱搖(繞z轉動運動):DW_IMU_YAW 1 << 4 , 二進制 10000 ,十進制 16
(DW_IMU_ROLL|DW_IMU_PITCH|DW_IMU_YAW) 按位加,例如, 二進制11100表示3個運動值都有。
frame.orientation[0] 橫搖 對應 數組元素 orientation[0]
frame.orientation[1] 縱傾 即船頭船尾上下顛的運動,對應 數組元素 orientation[1]
frame.orientation[2] 縱搖 即船頭向左右運動的同時,船尾向右左運動,對應 數組元素 orientation[2]
flag 是標志,二進制 11100 三者都有,00100隻有roll, 01100 有 roll 和 pitch; 11000 有 pitch and yaw, ...
flag 與 orientation數組數據長度無關,只是說,某個數組元素可能是 nan, 或 無效。例如 flag 等於2進制 11000 時,無roll, 則 orientation[0] 的數值無意義。
orientation[] 是 float64_t 型數據。
⑧ c語言nan問題
C語言里,除以0的運算一般會引起錯誤的(當然這依賴於編譯器),一般的做法是,在除法計算之前,判斷分母是否為零,然後給出正確結果,避免程序發生錯誤。
⑨ C++ 產生NAN的代碼看不懂
32位浮點數在機器中的表示按照IEEE的標準是這樣的:
+------+----------------+-------------------------------+
| 1bit | 8bit | 23bit |
+------+----------------+-------------------------------+
其中:1bit表示符號位(0表示正,1表示負),8bit表示指數(0~255,實際指數取值還要減去127,即指數取值區間為-127~128),23bit表示尾數。
這里所要說的浮點異常值就是這種表示產生的幾種特殊值,IEEE規定根據指數和尾數的不同分別可表示如下幾種特殊值:
1. 零值:按上述的浮點表述形式如果指數部分全部為0,並且尾數全部為0,則表示為浮點0.0,並且規定-0 = +0
2. 非規格化值:如果指數全部為0,尾數非0,則表示非規格化的值,16進制看到的就是[80xxxxxx]h或者[00xxxxxx]h
3. 無窮值:如果指數全部為1,尾數全部為0,則根據符號位分別表示正無窮大和負無窮大,16進制看到的就是[FF800000]h或者[7F800000]h
4. NAN:主角來了,如果指數全部為1,尾數非0,則表示這個值不是一個真正的值(Not A Number)。NAN又分成兩類:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN與SNAN的不同之處在於,QNAN的尾數部分最高位定義為1,SNAN最高位定義為0;QNAN一般表示未定義的算術運算結果,最常見的莫過於除0運算;SNAN一般被用於標記未初始化的值,以此來捕獲異常。
那麼既然NAN不是一個真實的數值,在程序如何判斷變數是否變成了NAN呢?大部分語言中針對NAN值都有一系列的函數定義,C語言中最常見的三個函數:
_isnan(double x); //判斷是否為NAN
_finite(double x); //判讀是否為無窮大
_fpclass(double x); //返回一系列的定義值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具體參考MSDN
對於上面的程序
unsigned long nan[2]={0xffffffff, 0x7fffffff};
定義一個64位的空間,內容為0x7fffffffffff,最高符號位為 0,其它位全為1,細分NAN的話,就是上面的QNAN。
然後轉化為double,
*(double*)nan;這里nan為數組名,實際值為數組地址,先轉化為(double*)指針,再取值*(double*)
至於要這樣寫,而不是直接double a = 0x7fffffffffff;是為了不讓編譯器轉化整形值0x7fffffffffff到浮點型(按IEEE 754定義的格式存儲)。
這里直接分配64位空間,然後寫好值,直接告訴編譯器,這個地方的數據是double,以後程序再訪問這個double值,發現它的內容是0x7fffffffffff,程序就知道這個是NaN了
⑩ c語言問題
\ 用於連接兩行,由於
#define isinf(x) \
(__extension__ ({__typeof__(x) __x = (x); \
(sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x);}))
寫在一行太長,不容易看,所以用\ 拆成好幾行