【问题标题】:set precision return statement C++设置精度返回语句 C++
【发布时间】:2015-10-11 17:51:05
【问题描述】:

我想从一个具有设定精度的函数返回一个双精度值!这可能吗?我想要 10-5 的准确度!

例如:

double f(double a ,double b)
{
  //something like return.setprecision(6); 
  return (a+b)/2;
}

【问题讨论】:

  • 你的意思是截断到 n 位小数吗?那有什么用?
  • Double 是二进制的。你不能准确地将它四舍五入到一定的小数位数,会有四舍五入的问题。因此,您需要说出您想要实现的目标,以获得正确的解决方案。
  • @hyde:关于“double 是二进制”,在当前的 PC 计算机上在实践中就是这样。 C++ 标准允许二进制和十进制浮点表示。然而,整数类型仅限于二进制。
  • @Cheersandhth.-Alf - 现代计算机以二进制形式存储内容。要显示它 - 它将其转换为另一种表示形式 - 通常是 ASCII。 (这也是二进制)。
  • @Cheersandhth.-Alf 关于 C++ 中(缺乏)标准浮点数的观点很好(如果有点高级主题并且与 OP 实际上无关),毕竟甚至可以启用积极的浮点优化可能会破坏为 IEEE 标准浮点编写的计算...

标签: c++ precision iomanip


【解决方案1】:

假设您的意思是截断到小数点后 5 位:

乘以 105。四舍五入为整数。将结果除以 105

对于四舍五入,请使用标准库,以免超出整数类型的范围。


请注意,结果只能对可以精确表示的数字是完美的。浮点数的常见表示是二进制,尽管 C++ 标准允许十进制表示。这意味着对于 大多数 个数字,结果将不准确。

【讨论】:

  • @EdHeal:如果 OP 需要处理 DBL_MAX 附近的数字,那么检查这种大小并什么也不做是很简单的。如果 OP 的意思不是 5 位小数,例如尾数中只有 6 位十进制数字,那么这更难做到。无论如何,结果只能对可以精确表示的数字是完美的。
  • 边缘情况是由于二进制和十进制系统之间的转换。有很多。
  • @EdHeal:这些不是极端情况。它们是常见的情况。 IE。您对“正确”有一个不切实际的概念,以及对“边缘情况”的一个相当奇特的概念,但是您指出的问题可能值得在答案中提及,而不仅仅是在评论中,所以我要补充它。
  • 请参考内存中双精度数在哪里可以表示为小数
  • @EdHeal:相反,C++ 标准明确要求内置整数类型为二进制,并保留为浮点类型定义的实现。因此,numeric_limits<T>::radix 被声明为“经常为 2”,因为 T 是浮点类型。它等同于 C 库的FLT_RADIX,然后您可以了解 C99 §5.2.4.2.2 描述浮点类型的特征,并要求基数(数字系统基数)为“整数 > 1”。
【解决方案2】:

不,这是不可能的。双精度取决于硬件/CPU 等。

无论如何 - 为什么要这样做?

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2021-07-25
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多