【问题标题】:Is there a better way to check if a value is bigger than of type double?有没有更好的方法来检查一个值是否大于 double 类型?
【发布时间】:2011-02-20 17:02:23
【问题描述】:
double x;
cin>>x;
if( x > 1.7976931348623157e+308 || x < -1.7976931348623157e+308 )
{
  cout<<"value not in range"<<endl;
  exit(1);
}

是否有 DOUBLE_MAX 或 DOUBLE_MIN 之类的,我需要包含任何头文件吗?

【问题讨论】:

  • 你最好根据你的应用选择一个范围。

标签: c++ double max minimum


【解决方案1】:

最大和最小的双精度类型都有常数,但由于x 是双精度类型,x 不能大于或小于这些值!如果您希望将输入的值与这些限制进行比较,您需要自己解析字符串并检查是否溢出。

【讨论】:

  • 大多数实现都支持 long double,其范围通常为 +- 10^4900。表示最大双精度的常量在将长双精度截断为双精度时很有用。我想我见过一些,但现在找不到。
【解决方案2】:

标头&lt;cfloat&gt; 等效于C 标头&lt;float.h&gt;,并包含DBL_MINDBL_MAX 以及许多其他内容。整数限制(C 中的&lt;limits.h&gt;)保存在&lt;climits&gt; 中。

这在 C++0x 草案的 18.3.2 中有详细说明。但是,正如在别处指出的那样,无论如何,双精度数都不能保持超出此范围的值。您必须使用“更大”的类型,例如 long double(尽管根据标准,它可能与 double 大小相同,因此不一定有帮助)。

这是一个完整的示例程序供您欣赏:-)

#include <iostream>
#include <cfloat>

int main (void) {
    long double bignum;
    std::cout << "Enter number: ";
    std::cin >> bignum;
    if ((bignum > (long double)DBL_MAX) || (bignum < (long double)DBL_MIN)) {
        std::cout << "Value not in range" << std::endl;
    } else {
        double x = bignum;
        std::cout << "Number was " << x << std::endl;
    }
    return 0;
}

附带成绩单:

$ ./qq.exe
Enter number: 1.7976931348623157e+308
Number was 1.79769e+308

$ ./qq.exe
Enter number: 1.7976931348623158e+308
Value not in range

【讨论】:

  • std::numeric_limits&lt;double&gt;::max()&lt;limits&gt; 标头中。但是,调用该函数应该从&lt;cfloat&gt;/&lt;float.h&gt; 返回DBL_MAX 的值。附带的min() 函数和DBL_MIN 常量也是如此。这是完成相同任务的另一种方式。 :)
  • std::numeric_limits&lt;double&gt;min() 返回大于零的最小double 值。 std::numeric_limits&lt;double&gt;::lowest() 是原始提问者要寻找的函数。
  • Crikey,我放弃 Perl 的全部原因是因为“有太多的方法可以做到这一点”:-) 现在 C++ 也在走同样的路。
  • 我相信climitscfloat中提供的所有[或至少大部分]宏都反映在std::numeric_limits中,加上更多的功能[例如上面提到的lowest方法]。如此有效,您仍然可以假设有一种方法可以做到这一点。这些是方法而不是宏在 C++98 中偶尔会出现问题,但在 C++0x 中得到修复。
  • 头文件 cfloatfloat.hclimitslimits.h 是一个 C 向后兼容的东西(它们定义了有些不受欢迎的宏)。 c++ 方式包括定义std::numeric_limits 模板的limits(没有c,也没有.h)。由于大多数 C 代码都可以在 C++ 编译器中编译,因此通常至少有两种方式可以做任何事情,C 方式和纯 C++ 方式。
猜你喜欢
  • 2016-10-28
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2022-09-22
相关资源
最近更新 更多