簡體   English   中英

將字符串(strtold)轉換為long double並從long double中減去得到> epsilon

[英]converting string (strtold) to long double and subtracting from long double gives > epsilon

不知道是否有人遇到過這個問題,可以幫助找到解決方案。

基本上我將字符串轉換為浮點值,然后從浮點值中減去以查看差異是否在+/- epsilon之內

問題是我做錯了什么,以獲得長雙倍的不同結果?

看起來2個雙打雙精度字之間的差異產生了一個精度為float的值,但不確定為什么...

代碼的輸出(mac和linux 64位都給出了相同的結果)

float        : a=145.568 d=145.568 epsilon=1.19209e-07 fabsf(a - d)=0 equal? equal
double       : b=145.568 e=145.568 epsilon=2.22045e-16 fabs(b - e)=0 equal? equal
long double  : c=145.568 f=145.568 epsilon=1.0842e-19 fabsl(c - f)=5.41234e-15 equal? not equal

這是代碼

#include <limits>
#include <cstddef>
#include <iostream>
#include <sstream>
#include <cmath>

template <typename T>
bool cmp_equal(const T& lhs,
               const T& rhs,
               const T& epsilon = std::numeric_limits<T>::epsilon()) {
    const T diff = (lhs - rhs);
    return ((diff >= -epsilon) && (diff <= epsilon));
}

int main()
{
    float a = 145.5678f;
    double b = 145.5678;
    long double c = 145.5678l;

    std::stringstream s("145.5678 \r\t\n");
    char* end;

    float d = std::strtof(s.str().c_str(), &end);
    double e = std::strtod(s.str().c_str(), &end);
    long double f = std::strtold(s.str().c_str(), &end);

    std::cout << "float        : " << "a=" << a << " d=" << d
              << " epsilon=" << std::numeric_limits<float>::epsilon()
              << " fabsf(a - d)=" << std::fabsf(a - d)
              << " equal? " << (cmp_equal(a, d)?"equal":"not equal")
              << std::endl;

    std::cout << "double       : " << "b=" << b << " e=" << e
              << " epsilon=" << std::numeric_limits<double>::epsilon()
              << " fabs(b - e)=" << std::fabs(b - e)
              << " equal? " << (cmp_equal(b, e)?"equal":"not equal")
              << std::endl;

    std::cout << "long double  : " << "c=" << c << " f=" << f
              << " epsilon=" << std::numeric_limits<long double>::epsilon()
              << " fabsl(c - f)=" << std::fabsl(c - f)
              << " equal? " << (cmp_equal(c, f)?"equal":"not equal")
              << std::endl;
}

如您所提到的,長雙精度差看起來等於浮點精度(不過,它是雙精度精度)。

文字浮點數(如文字整數)后可以帶有后綴,因此轉換使用特定類型。 默認情況下,類型為double。

您需要獲得所需的精度:

float a = 145.5678f;
double b = 145.5678;
long double c = 145.5678l;

floats的“ f”(或“ F”)和long double floats “ l”(或“ L”)。

暫無
暫無

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

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