簡體   English   中英

對於小於雙倍范圍的值,啟用boost :: lexical_cast會超出范圍錯誤

[英]Enable boost::lexical_cast to throw out of range error for values smaller than double range

boost::lexical_cast會為大於double的最大值的值拋出錯誤。 但是對於小於最小值的數字,它會默默地將其設為零。 如何為以后的情況啟用超出范圍的錯誤(即如果一個數字小於2.22507e-308,那么解析器應該拋出一些錯誤)?

#include <iostream>
#include <limits>
#include <boost/lexical_cast.hpp>

int main()
{
    std::cout<<boost::lexical_cast<long double>("1.5787658476e-400")<<'\n';
    std::cout<<boost::lexical_cast<double>("1.5787658476e-400")<<'\n';
    std::cout<<std::numeric_limits<double>::min()<<'\n';

    try{
        std::cout<<boost::lexical_cast<double>("1.5787658476e+400")<<'\n';
    } catch(boost::bad_lexical_cast &e)
    {
        std::cout<<e.what()<<'\n';
    }
     std::cout<<std::numeric_limits<double>::max()<<'\n';

    return 0;
}

我認為這是預期的行為。

您可以檢查該號碼是否完全正確。 但是一般來說十進制表示並不完全對應於二進制表示,因此在一般情況下(任何十進制輸入有效)都會變得棘手並且不可能。

您可以使用十進制數類型實現更好的往返安全性,例如boost::multiprecision::cpp_dec_float

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM