3

バイナリ表現としてRFC 7049を使用するプロトコルを作成しています。標準では、数値がそれぞれの 64 ビット数値と同等である場合、プロトコルは数値の 32 ビット浮動小数点表現を使用できると規定されています。変換によって精度が失われてはなりません。

  • 32 ビットの浮動小数点数のうち、64 ビット整数よりも大きく、それらと数値的に等しいものはどれですか?
  • float x; uint64_t y; (float)x == (float)y値が同等であることを確認するのに十分な比較ですか? この比較は真実になるでしょうか?

RFC 7049 §3.6。数字

この仕様の目的上、同じ数値の数値表現はすべて同等です。これは、エンコーダーが 0.0 の浮動小数点値を整数 0 としてエンコードできることを意味します。ただし、整数値を見つけることを期待するアプリケーションは、エンコーダーがこれらが望ましいと判断した場合にのみ浮動小数点値を見つける可能性があることも意味します。浮動小数点値が 64 ビット整数よりもコンパクトな場合と同様です。

4

3 に答える 3

1

以下は、float と integer を比較する Julia の方法に基づいています。これは、80 ビットlong doubles または浮動小数点例外へのアクセスを必要とせず、どの丸めモードでも機能するはずです。これはどの Cfloatタイプ (IEEE754 であろうとなかろうと) でも機能し、未定義の動作を引き起こすことはないと思います。

更新: 技術的には、これはバイナリfloat形式を想定しており、指数のサイズは 2 64floatを表すのに十分な大きさです: これは、標準の IEEE754 binary32 (質問で参照) には確かに当てはまりますが、たとえば、binary16 には当てはまりません。

#include <stdio.h>
#include <stdint.h>

int cmp_flt_uint64(float x,uint64_t y) {
  return (x == (float)y) && (x != 0x1p64f) && ((uint64_t)x == y);
}

int main() {
  float x = 0x1p64f;
  uint64_t y = 0xffffffffffffffff;

  if (cmp_flt_uint64(x,y))
    printf("true\n");
  else 
    printf("false\n");
  ;
}

ここでのロジックは次のとおりです。

  • 最初の等式は、 が区間 [0,2 64 ]xの非負の整数である場合にのみ真になります。
  • x2 番目は(したがって(float)y) が 2 64ではないことを確認します。この場合、 はya で正確に表すことができないfloatため、比較は false になります。
  • の残りの値はx正確に に変換できるuint64_tため、キャストして比較します。
于 2015-09-28T09:22:28.387 に答える