IsNaNがおかしいのでは

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: IsNaNがおかしいのでは

ありがとうございました

by T,S, » 2006年10月15日(日) 00:21

ありがとうございました

by tak » 2006年10月14日(土) 19:10

その点には気がついたので結構前に修正いたしました。

次のリリースで修正版が配布されるとおもいますので、しばらくお待ちください。

または Include\basic\function.sbp を次の最新版と差し替えてもらっても構いません。
http://cvs.sourceforge.jp/cgi-bin/viewc ... nction.sbp


ご報告ありがとうございました。

そこではなくて

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

代入してしまっているのではないか、ということです。

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

IsNaNがおかしいのでは

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]

ページトップ