タグ付けされた質問 「ieee-754」

3
なぜインテル®C ++コンパイラーでNaN-NaN == 0.0なのですか?
NaNが算術で伝播することはよく知られていますが、デモを見つけることができなかったため、簡単なテストを作成しました。 #include <limits> #include <cstdio> int main(int argc, char* argv[]) { float qNaN = std::numeric_limits<float>::quiet_NaN(); float neg = -qNaN; float sub1 = 6.0f - qNaN; float sub2 = qNaN - 6.0f; float sub3 = qNaN - qNaN; float add1 = 6.0f + qNaN; float add2 = qNaN + qNaN; float …
300 c++  c  floating-point  ieee-754  icc 

12
IEEE754 NaN値に対してfalseを返すすべての比較の根拠は何ですか?
NaN値の比較が他のすべての値と異なる動作をするのはなぜですか?つまり、演算子==、<=、> =、<、>のいずれかまたは両方の値がNaNであるすべての比較は、他のすべての値の動作とは逆に、falseを返します。 これにより数値計算がある程度簡略化されたと思いますが、他の設計上の決定について詳細に説明しているKahanによるIEEE 754のステータスに関する講義ノートでさえ、明確に述べられた理由を見つけることができませんでした。 この逸脱した動作は、単純なデータ処理を行うときに問題を引き起こしています。たとえば、Cプログラムでいくつかの実数値フィールドに対してレコードのリストを並べ替える場合、NaNを最大要素として処理する追加のコードを記述する必要があります。そうしないと、並べ替えアルゴリズムが混乱する可能性があります。 編集: これまでの答えはすべて、NaNを比較することは無意味であると主張しています。 私は同意しますが、これは正解が偽であることを意味するのではなく、幸いなことに存在しないブール値ではない(NaB)です。 したがって、比較に対してtrueまたはfalseを返すかどうかの選択は、私の見解では任意であり、一般的なデータ処理では、データ構造を考慮せずに、通常の法則(==の再帰性、<、==、>のトリコトミー)に従うと有利です。これらの法律に依存するものは混乱します。 だから私は、哲学的推論だけでなく、これらの法律を破ることのいくつかの具体的な利点を求めています。 編集2: NaNを最大にすることが悪い考えになる理由が今理解できたと思います、それは上限の計算を台無しにするでしょう。 NaN!= NaNは、次のようなループで収束を検出しないようにするために望ましい場合があります。 while (x != oldX) { oldX = x; x = better_approximation(x); } ただし、絶対的な違いを小さな制限と比較することで記述します。だから私見これはNaNで反射性を壊すための比較的弱い議論です。



2
IEEE 754フロートが正確に表現できない最初の整数はどれですか?
わかりやすくするために、IEE 754 floatを実装する言語を使用していて、次のように宣言したとします。 float f0 = 0.f; float f1 = 1.f; ...そしてそれらをプリントアウトすると、0.0000と1.0000が正確に得られます。 しかし、IEEE 754は実際の線に沿ったすべての数値を表すことができません。ゼロに近い、「ギャップ」は小さいです。遠ざかるにつれて、ギャップは大きくなります。 だから、私の質問は、IEEE 754 floatの場合、正確に表現できない最初の(ゼロに最も近い)整数ですか?私は今のところ、32ビットの浮動小数点数にのみ関心がありますが、誰かが64ビットの浮動小数点数を教えてくれれば、その答えを聞きたいと思います。 私は、これが2計算のような単純なようであろうと思っbits_of_mantissaに 1を加算し、bits_of_mantissaが何ビット標準露出させます。私のマシン(MSVC ++、Win64)で32ビットの浮動小数点に対してこれを行いましたが、問題はないようです。

4
Python 3では4 * 0.1の浮動小数点値は見栄えが良いのに、3 * 0.1は見栄えが悪いのはなぜですか?
ほとんどの小数には正確な浮動小数点表現がないことがわかっています(浮動小数点演算は壊れていますか?)。 しかし、両方の値が実際に醜い10進数表現を持っている場合、なぜ4*0.1がとしてうまく表示されるのかわかりません0.4が、そうで3*0.1はありません。 >>> 3*0.1 0.30000000000000004 >>> 4*0.1 0.4 >>> from decimal import Decimal >>> Decimal(3*0.1) Decimal('0.3000000000000000444089209850062616169452667236328125') >>> Decimal(4*0.1) Decimal('0.40000000000000002220446049250313080847263336181640625')

10
C#での浮動小数点演算は一貫していますか?できますか?
いいえ、これは「なぜ(1 / 3.0)* 3!= 1なのか」という別の質問ではありません。 最近、浮動小数点についてよく読んでいます。具体的には、同じ計算が異なるアーキテクチャまたは最適化設定で異なる結果をもたらす方法です。 これは、リプレイを保存する、または(サーバークライアントではなく)ピアツーピアネットワーク化されたビデオゲームの問題であり、プログラムを実行するたびにすべてのクライアントがまったく同じ結果を生成することに依存します。浮動小数点計算は、異なるマシン(または同じマシンでも!)で劇的に異なるゲーム状態につながる可能性があります。 これは、主に一部のプロセッサ(つまりx86)が倍の拡張精度を使用するため、IEEE-754に「従う」プロセッサの間でも発生します。つまり、80ビットのレジスタを使用してすべての計算を行い、64ビットまたは32ビットに切り捨てて、計算に64ビットまたは32ビットを使用するマシンとは丸めの結果が異なります。 オンラインでこの問題のいくつかの解決策を見てきましたが、すべてC ++ではなくC ++向けです。 (Windows)、(Linux?)、または(BSD)をdouble使用して、倍精度拡張モードを無効にします(すべての計算でIEEE-754 64ビットを使用し_controlfp_sます)。_FPU_SETCWfpsetprec 常に同じコンパイラーを同じ最適化設定で実行し、すべてのユーザーが同じCPUアーキテクチャーを持っている必要があります(クロスプラットフォームの遊びはありません)。私の「コンパイラ」は実際にはJITであるため、プログラムを実行するたびに異なる最適化が行われる可能性があります、これは可能ではないと思います。 固定小数点演算を使用しfloat、double完全に回避します。decimalこの目的のためにSystem.Math機能しますが、はるかに遅くなり、ライブラリ関数のどれもそれをサポートしません。 それで、これはC#の問題でもありますか? (Monoではなく)Windowsのみをサポートする場合はどうなりますか? もしそうなら、私のプログラムを通常の倍精度で実行させる方法はありますか? そうでない場合、浮動小数点計算の一貫性を保つのに役立つライブラリはありますか?

12
2つの等しくない浮動小数点数を引くことによって0を取得することは可能ですか?
次の例では、0(または無限大)による除算を取得できますか? public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a - b); } } もちろん、通常はそうなりません。しかし、どのような場合aとb非常に接近している、できる(a-b)ことになり0、計算の精度が原因? この質問はJavaに関するものですが、ほとんどのプログラミング言語に当てはまると思います。

3
PHPでの型変換と(厳密な)大なり/小なり比較
PHPは型ジャグリングで有名です。私はそれが私を困惑させることを認めなければなりません、そして私は比較で基本的な論理的/基本的なものを見つけるのに苦労しています。 例:Ifは$a > $btrueで、$b > $c真のですが、それはそれが意味する必要があります$a > $cあり、常にあまりにも本当? 基本的なロジックに従って、私はイエスと言いますが、私はこれに本当にPHPを信頼していません。たぶん、誰かがこれが当てはまらない例を提供できますか? また、私は厳密な小なり演算子と大なり演算子(それらの意味は過去に等価比較からのみ知っていたものとして説明されているので)で左右のオペランドが入れ替えられた場合に違いがあるかどうか疑問に思っています厳密に等しくない値: # Precondition: if ($a === $b) { throw new Exception( 'Both are strictly equal - can not compare strictly for greater or smaller' ); } ($a > $b) !== ($b > $a) ほとんどすべてのタイプ比較の組み合わせでは、これらの大小比較演算子は文書化されていないため、この場合はマニュアルを読んでもあまり役に立ちませんでした。


2
静かなNaNとシグナリングNaNの違いは何ですか?
浮動小数点について読んだところ、NaNが演算から生じる可能性があることを理解しています。しかし、これらが概念であるかを正確に理解できません。それらの違いは何ですか? C ++プログラミング中に作成できるのはどれですか?プログラマーとして、sNaNを引き起こすプログラムを作成できますか?

3
非正規化浮動小数点数とは何ですか?
isnormal()リファレンスページは次のように述べています。 指定された浮動小数点数argが正規であるかどうか、つまり、ゼロ、非正規化数、無限大、またはNaNのいずれでもないかどうかを判別します。 数値がゼロ、無限、またはNaNであることは、それが何を意味するかを明確にしています。しかし、それはまた、異常と言います。数が非正規化数になるのはいつですか?

3
JSエンジンはNaNのビットを変更できますか?
JavaScriptでは、NaN値は、内部的には広範囲の64ビットdoubleで表すことができます。具体的には、次のビットごとの表現を持つ任意のdouble: x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx NaNとして解釈されます。私の質問は、ArrayBuffersを使用して2つの32ビットuintをJS番号にキャストし、渡してから、2つの32ビットuintにキャストするとします。復元されたビットは元のビットと同じですか、それともJSエンジンはNaNのビットを自由に変更できますか?言い換えれば、JS番号を使用して64ビットを無損失で格納できますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.