【问题标题】:issue in std::max() function comparision with fixed point implementationstd::max() 函数与定点实现的比较问题
【发布时间】:2020-01-29 15:49:29
【问题描述】:

是否有任何可用的标准函数可以帮助我比较两个浮点值之间的max()min()

我已经为这个min()max() 函数编写了从q0s32q32s0 类型(33 种类型)的定点实现。

但我想用std:min()std::max() 函数测试我的函数的精度损失。但是从标准函数得到的结果并不好。

我尝试过这种方式,但这对我不起作用,因为结果不符合预期。

代码:

float num1 = 4.5000000054f;
float num2 = 4.5000000057f;

float resf = std::max(num1,num2);
printf("Result is :%20.15f\n",resf);
printf("num1 :%20.15f and num2 :%20.15f\n",num1,num2);

输出:

Result is :   4.500000000000000
num1 :   4.500000000000000 and num2 :   4.500000000000000

【问题讨论】:

  • 您的期望是什么?
  • 浮点数只有 6-7 位精度。您的 54 和 57 并脱离了可以代表的范围。如果要定点,需要获取或制作定点库,c++floatdouble都是浮点类型。
  • 如果你要进入浮点数学世界,这是一本必读的书:stackoverflow.com/questions/588004/…
  • 您使用浮点数,它们是根据 IEEE754 32 位大小的浮点数。您的值落后于浮点精度
  • 4.5000000054 和 4.5000000057 都不能用单精度 IEEE 754 数据类型表示,这可能是您的 floatnum1num2 实际上都代表 4.5,这就是你得到的。

标签: c++ floating fixed-point


【解决方案1】:

大多数 c++ 实现都使用 IEEE 754 标准进行浮点运算。 Here 是有关此问题的一些有用信息

在 IEEE 754 中 float 是一个 32 位单精度浮点数(1 位为符号,8 位为指数,23* 为值),即 float 有7 位小数 精度。

在 IEEE 754 中 double 是一个 64 位双精度浮点数(符号 1 位,指数 11 位,值 52* 位),即 double有 15 位小数的精度。

您需要改用double 来获得所需的结果。

【讨论】:

  • 我不认为 C++ 标准定义了浮点类型的表示,请参阅basic.fundamental/12/4
  • @DanielLangr -- 这在形式上是正确的,但在实践中,它是 IEEE 754,除非您使用的是外来硬件。
  • 我同意 C++ 标准没有指定,但在实践中通常是正确的。也许只是对答案的编辑以澄清。根据标准,floatdouble 都可以是 8 位。实际的实现显然不会这样做。不是 geeksforgeeks 的粉丝,也许是像cppreference这样更有信誉的来源@
  • 某些 Arduino 板有32 bit doubles。这是一个很常见的反例。
  • 无论在大多数情况下是否正确,您链接的页面上的声明“float is a 32 bit IEEE 754 single precision Floating Point Number”在它声称的一般性上都是错误的
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2016-07-28
  • 2020-10-02
  • 2023-03-19
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多