【问题标题】:How to have both 32bit and 64bit float in C++如何在 C++ 中同时具有 32 位和 64 位浮点数
【发布时间】:2014-02-07 13:17:23
【问题描述】:

我有一个文件规范(此处为:http://www.septentrio.com/secure/asterx1v_2_1/SBF%20Reference%20Guide.pdf),其中包含标记为 32 位和 64 位浮点数的字段(参见第 8 页)。如何在我的程序中同时使用这两种宽度?我现在正在 Mac OSX 上开发,但我也将部署在 Linux 机器上。

更多细节:

我知道我可以告诉编译器宽度,但我如何区分两个不同的浮点宽度?也许有人也有改变我解析方式的建议,即reinterpret_cast(buffer+offset),然后使用这些值。这些文件很大(4GB),所以我需要性能。

【问题讨论】:

  • 我们在谈论哪个操作系统?
  • 在您的平台上可能 float 是 32 位,double 是 64 位 - 这很常见。
  • 是的,但是浮点数和双精度数有不同的内部结构对吗?
  • 也许这会有所帮助:stackoverflow.com/a/19466500/2293156
  • 文档说 4 和 8 字节浮点数使用 IEEE 格式。许多(但不是全部)机器对 float 和 double 类型使用相同的格式。

标签: c++ floating-point 64-bit 32-bit


【解决方案1】:

尽管如此,这似乎很明显:

在 Intel 平台和许多其他平台上,float 是 32 位浮点值,double 是 64 位浮点值。试试这个方法。它很可能会起作用。

如果您的编译器允许,请确保在程序开始时或在编译期间静态检查您的类型的 sizeof。

再一次,先尝试简单的解决方案。

Float 和 double 算法都在 Intel 上实现,而且速度很快。在任何情况下,本机算术都是您可以从 CPU 获得的最快的。

IEEE 754 (http://en.wikipedia.org/wiki/IEEE_floating_point) 定义的不是一种浮点格式,而是多种浮点格式,例如 4、8、16 字节等。它们都有不同的范围和精度,但它们仍然是 IEEE 值。

【讨论】:

  • 您能否澄清浮点数和双精度数是否都以规范(第 8 页)中给出的相同 IEEE 格式存储?
  • 我没有 MAC 经验,但知道我们现在是基于 Intel 的。这意味着您只需在结构中定义 float 和 double 字段,它就会起作用。您只需要确保正确的字段对齐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2017-09-12
相关资源
最近更新 更多