ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
T,S,
#1
投稿記事
by T,S, » 2006年10月14日(土) 07:41
Active Basic 5 CP3 の、
include/basic/function.abpにおいてこのような関数がありましたが、
コード: 全て選択
Function IsNaN(ByVal x As Double) As BOOL
Dim p As *DWord
p = VarPtr(x) As *DWord
If (p[1] And &H7FF00000) = &H7FF00000 Then
If (p[0] <> 0) Or ((p[1] And &HFFFFF) <> 0) Then
IsNaN = TRUE
End If
End If
IsNaN=FALSE
End Function
これだと、いかなる条件でもFALSEしか返らないような気がします。[/code]
イグトランス
記事: 899 登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
#2
投稿記事
by イグトランス » 2006年10月14日(土) 13:18
いえ,これで良いのです。
このIsNaNは,最初のIfで指数部を調べ,次のIfで仮数部を調べています。
NaNは「符号部:不定,指数部:全ビット1,仮数部:少なくともどこか1ビット立っている」ということになっています。
Double型は,符号部:1ビット,指数部:11ビット,仮数部:53ビットあり,
しかもx86/x64ではリトルエンディアンであることを考慮するとそのようになるのです。
参考:
IA-32 インテル(R) アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル 上巻: 基本アーキテクチャー 4.2.2 表4.3
T,S,
#3
投稿記事
by T,S, » 2006年10月14日(土) 17:57
説明ありがとうございます。
しかし、自分が言っているのは、
If (p[1] And &H7FF00000) = &H7FF00000 Then
If (p[0] <> 0) Or ((p[1] And &HFFFFF) <> 0) Then
IsNaN = TRUE
End If
End If
ここで、せっかく IsNaN = TRUE となっても、
そこが終わった後
IsNaN=FALSE
代入してしまっているのではないか、ということです。
T,S,
#5
投稿記事
by T,S, » 2006年10月15日(日) 00:21
ありがとうございました