問題タブ [ieee-754]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#でfloatのIEEE754バイナリ表現を取得する方法
byte []に書き込んだり、byte[]から読み取ったりしたい単精度および倍精度の浮動小数点数がいくつかあります。.Netに、32ビットおよび64ビットのIEEE 754表現との間で変換するために使用できるものはありますか?
c - IEEE754番号(printfなし)をどのように印刷しますか?
この質問の目的のために、私には施設を使用する能力がありませんprintf
(残念ながら、理由はわかりませんが、今のところ、私が何をしているのかを知っていると仮定しましょう)。
IEEE754単精度数の場合、次のビットがあります。
ここS
で、は符号、E
は指数、F
は分数です。
NaN
記号の印刷は、 (E == 0xff, F != 0
)、Inf
(E == 0xff, F == 0
)、0
(E == 0, F == 0
、指数バイアスが使用されていないという理由だけで特別と見なされる)などのすべての特殊なケースをキャッチするのと同様に、すべてのケースで比較的簡単です。
2つの質問があります。
E == 0, F != 0
1つ目は、非正規化された数値(where )を正規化された数値(where)に変換する最善の方法1 <= E <= 0xfe
です。次の質問への答えを単純化するためにこれが必要になると思います(しかし、私は間違っている可能性があるので、遠慮なく私を教育してください)。
2番目の質問は、正規化された数値を印刷する方法です。-3.74195E3
指数関数のような方法と非指数関数のような方法の2つの方法でそれらを印刷できるようにしたいと思います3741.95
。ただし、これら2つを並べて見るだけで、小数点を移動するだけで前者を後者に変えるのはかなり簡単なはずです。それでは、指数形式に集中しましょう。
ずっと前にPIを印刷するために使用したアルゴリズムの漠然とした思い出があります。ここでは、減少し続ける数式の1つを使用し、可能性の上限と下限を維持し、両方の制限が一致したときに桁を出力し、計算を次のようにシフトします。係数10(したがって、上限と下限が
3.2364
と3.1234
の場合、を出力3
して計算で調整できます)。しかし、それをやったのは久しぶりなので、それがここでの適切なアプローチかどうかさえわかりません。
1/2
小数部( 、、など)を移動するとき、各ビットの値は前のビットの半分であるため、そう思われ1/4
ます1/8
。
どうしても必要な場合を除いて、ソースコードを調べなくprintf
てもいいので、誰かがこれを手伝ってくれるなら、私は永遠に感謝します。
c# - ulong のビットを double に変換するにはどうすればよいですか?
Java のDouble.longBitsToDoubleメソッドに相当する C# を探しています。ulong に格納されている double 値があり、それらのビットを double を表すように変換したいと考えています。C#でこれを行う簡単な方法はありますか?
c - IEEE 754(ansi-c)に準拠したdoubleの上位/下位マシンワードを取得するにはどうすればよいですか?
fdlibmのsqrt実装を使用したい。
この実装では、(エンディアンに応じて)次の方法で(ダブルの下位/上位32ビットにアクセスするための)いくつかのマクロを定義します(ここでは、リトルエンディアンバージョンのみ)。
flibmのreadmeは、次のように言っています(少し短縮されています)
この実装とこれらのマクロをcbmcモデルチェッカーで使用したいと思います。これはansi-cに準拠している必要があります。
何が問題なのか正確にはわかりませんが、次の例は、これらのマクロが機能していないことを示しています(リトルエンディアンが選択され、32ビットのマシンワードが選択されました)。
どちらも間違っているようです。tempのすべての値に対してHighは空のようです。
ansi-cで両方の32ワードにアクセスするための新しいアイデアはありますか?
更新:すべての回答とコメントをありがとう。あなたの提案はすべて私のために働いた。今のところ、「R ..」バージョンを使用することにし、エンディアンに関して私のツールで最も堅牢であると思われるため、これをお気に入りの回答としてマークしました。
floating-point - IEEE-754 浮動小数点精度: どのくらいのエラーが許容されますか?
fdlibmから現在使用しているモデル チェッカー ツール ( cbmcsqrt
) への関数 (64 ビット double 用) の移植に取り組んでいます。
仕事の一環として、ieee-754 規格についてよく読みましたが、基本演算 (sqrt を含む) の精度の保証を理解していなかったと思います。
fdlibm の sqrt のポートをテストすると、64 ビット double で sqrt を使用して次の計算が得られました。
(このケースは、精度に関する私のテストで単純な事後条件を破りました。この事後条件が IEEE-754 で可能かどうかはわかりません)
比較のために、いくつかの多精度ツールは次のように計算しました。
左から 17 番目の数字が異なることがわかります。これは、次のようなエラーを意味します。
質問 1: この膨大な量のエラーは許容されますか?
標準では、すべての基本演算 (+、-、、/、sqrt) は 0.5 ulp 以内である必要があるとされています。これは、最も近い fp 表現に丸められた数学的に正確な結果に等しくなければならないことを意味します (wiki では、一部のライブラリは1 ulp しか保証されませんが、現時点ではそれほど重要ではありません)。
質問 2: すべての基本操作で、64 ビット double (マシン イプシロン) で 2.220446e-16 未満のエラーが発生するということですか?
x86-32 Linux システム (glibc / eglibc) で同じことを計算したところ、fdlibm で得られたのと同じ結果が得られました。
- a: 私は何か間違ったことをしました (しかし、どのように:
printf
候補になるでしょうが、それが理由であるかどうかはわかりません) - b: エラー/精度はこれらのライブラリで一般的です
javascript - Firebug での予期しない結果
Firebug コンソールでの予期しない結果。この操作の理由: 1.7E16+2 の最後の数字は 2 で、1.7E16+3 操作の最後の数字は 4 です:D これは JavaScript のバグですか?
java - IEEE-754 double (64 ビット浮動小数点) と long (64 ビット整数) の再検討
私が懸念している限り、完全に解決された質問(数値変換が値を変更するかどうかをテストする方法は? )を再検討しています。問題は、特定の数値が JavaScript の IEEE-754 Number 型をオーバーフローする時期を検出することでした。前の質問は C# を使用しており、マークされた回答は完全に機能しました。
今、私はまったく同じタスクを実行していますが、今回は Java で動作しません。私の知る限り、Javaはそのdouble
データ型にIEEE-754を使用します。したがって、精度を失わせるために前後にキャストできるはずですが、往復します。これに戸惑い、私はJavaを深く掘り下げ始めましたが、今では本当に混乱しています。
C# と Java の両方で、long の最小値と最大値は同じです。
私の知る限り、これらの値は、指数と符号用に予約されている固定ビットのため、IEEE-754 で表現可能な数値の範囲外です。
これはfalse
、Java で (値 = -9223372036854775808L) を返します。
これはfalse
、Java で (値 = -9223372036854775808L) を返します。
これはtrue
(value = -9223372036854775808L) を返しますが、精度は低くなります。
なぜこれがこのように機能するのですか?コンパイラーの最適化のようなものを見逃していますか? 例えば、コンパイラーは私の変換を検出し、それらを「修正」していますか?
編集:リクエストによるテストケースの追加。これら 3 つのテストはすべて失敗します。
floating-point - IEEE浮動小数点標準の指数と仮数のサイズの根拠は何ですか?
浮動小数点がどのように機能するかについては十分に理解していますが、特定の指数と仮数のサイズがどのように決定されたかを知りたいです。それらはある意味で最適ですか?浮動小数点表現の最適性はどのように測定できますか (いくつかの方法があると思います)。これらの問題は公式の標準で対処されていると思いますが、私はそれにアクセスできません。
javascript - JS で float のバイトを読み書きする
JS で float 値のバイトを読み取る方法はありますか? 私が必要としているのは、生の FLOAT または DOUBLE 値を作成する必要のあるバイナリ形式に書き込むことです。そのため、バイトごとの IEEE 754 表現を取得する方法はありますか? もちろん、ライティングについても同じ質問です。
math - 浮動小数点の専門家が必要です
このlog2関数がどのように機能するかを詳しく説明してもらえますか: