将 2^31 分配给 float 或 double

Rom*_*dgz -1 c++ floating-point double double-precision floating-point-precision

我必须将整数值乘以 2^31。我用谷歌搜索了一下,看起来双打的范围在 2.23e-308 <= |X| 之间 使用 64 位时 <= 1.79e308,并且是 1.18e-38 <= |X| 之间的浮点数 <= 3.40e38。

这比我需要的要多得多。但这不起作用。

我的头文件中有这个常量值:

static const float SCALE_FACTOR = 2^-31;
Run Code Online (Sandbox Code Playgroud)

如果那么我就这样做:

float dummy = SCALE_FACTOR;
Run Code Online (Sandbox Code Playgroud)

那么,dummy 的值为 11。

我不知道问题是否在于分配这样的常量值,但我不知道如何在不损失精度的情况下编写它。

有什么帮助吗?

编辑:抱歉,愚蠢的问题。我的 MatLab 背景背叛了我,忘记了 ^ 在 C++ 中不是用于求幂。我已投票结束。

Roo*_*ook 5

^ 是 C++ 中的按位异或运算符,而不是数学求幂运算符。您有几种选择。

  1. 因为您以本质上有损的格式 a 存储常量,所以float您可以计算出以 10 为基数的e形式文字并使用它:也许类似于4.6566128730773926e-0102^-31。这很容易出错(例如,我就犯了一个错误),并且不一定可以在浮点格式之间移植。
  2. 您可以使用可在编译时计算的常量表达式来设置常量,并使用整数文字:例如,0x80000000或者1UL << 31对于 2^31,或者1.0f / 0x80000000对于 2^-31。

pow当然,您可以使用某种函数在运行时计算该值。

顺便说一句,如果您使用整数,为什么不只使用long long64 位整型或其他 64 位整型,而不是使用浮点数,因为浮点数很可能会给您带来舍入错误?从您的问题中并不完全清楚您正在查看浮点值是因为您需要浮点值范围,还是因为您只是担心溢出 32 位整数值。

  • 我仍然不知道为什么 C++ 不为像 2 的 -31 次方这样的文字提供十六进制点。有一种方法可以用 C 实现,为什么不用 C++ 呢?也可以允许十六进制文字的尾数指数形式,就像十进制文字一样,例如 2.X-8 (3认同)