c++ - 在 C/C++ 中可以用 float 准确表示的最大 uint64

标签 c++ floating-point type-conversion precision

<分区>

我知道浮点精度只有这么多位。毫不奇怪,以下代码认为 (float)(UINT64_MAX)(float)(UINT64_MAX - 1) 相等。我正在尝试编写一个函数来检测这种类型的(由于缺少适当的术语)“转换溢出”。我以为我可以以某种方式使用 FLT_MAX 但这是不正确的。执行此操作的正确方法是什么?

#include <iostream>
#include <cstdint>

int main()
{
  uint64_t x1(UINT64_MAX);
  uint64_t x2(UINT64_MAX - 1);
  float f1(static_cast<float>(x1));
  float f2(static_cast<float>(x2));
  std::cout << f1 << " == " << f2 << " = " << (f1 == f2) << std::endl;
  return 0;
}

最佳答案

Largest uint64 which can be accurately represented in a float
What's the right way to do this?

FLT_RADIX == 2 时,我们正在寻找以下形式的 uint64_t,其中 nfloat 值中可编码的最大位数。这通常是 24。请参阅 FLT_MANT_DIG 中的 <float.h>

111...(total of n binary digits)...111000...(64-n bits all zero)...000.
//
//1234561234567890
0xFFFFFF0000000000, in decimal: 18446742974197923840
// e.g. 
~( (1ull << (64-FLT_MANT_DIG)) - 1)

关于c++ - 在 C/C++ 中可以用 float 准确表示的最大 uint64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73887834/

相关文章:

c++ - 将节点数组(可变长度)转换为 const float** 以调用 opencv.calcHist

比较 C 中的 float

python - 如何在连续信号中找到无效值?

C++ 如何将 char 数组转换为字节 vector (vector<byte>)

r - 为什么 R 中的 xts 对象除以常量会得到矩阵对象(丢失日期列)?

c++ - 缩小png字体

c++ - 德摩根定律和 C++

c++ - 单行指针操作

python - 从文本文件中查找具有最小值和最大值的行以及行号(获取值错误浮点类型)

c++ - 从不遵循特定格式的字符串中提取数字和字符? (后缀计算器)