C++ 如何在C++;

C++ 如何在C++;,c++,floating-point,C++,Floating Point,我正在写一个程序,其中有一些操作正在浮点数上执行。调试程序后,我知道对于特定的测试用例,变量的值等于-2.38418579e-07。现在我把精度设置为小数点后的2位。所以当我打印它时,它打印为-0.00 但是,我希望输出为0.00,而不是-0.00。我对变量的值尝试了各种if条件。然而,它们没有帮助。在C++中,有人建议如何去除-0.00,首先,你应该定义一个容忍数作为阈值,其中任何浮点数的绝对值都被认为是零。例如,您可以将此阈值定义为: #define zero 1e-6 然后,您可以使用以

我正在写一个程序,其中有一些操作正在浮点数上执行。调试程序后,我知道对于特定的测试用例,
变量的值等于-2.38418579e-07
。现在我把精度设置为小数点后的2位。所以当我打印它时,它打印为-0.00


但是,我希望输出为0.00,而不是-0.00。我对变量的值尝试了各种
if
条件。然而,它们没有帮助。在C++中,有人建议如何去除-0.00,首先,你应该定义一个容忍数作为阈值,其中任何浮点数的绝对值都被认为是零。例如,您可以将此阈值定义为:

#define zero 1e-6
然后,您可以使用以下构造来“过滤”浮点数:

template<typename T>
std::enable_if_t<std::is_floating_point<T>::value, T> sanitize(T &&num) {
  return std::abs(num) < zero? T{} : num;    
}
模板
std::启用\u if\u t消毒(t&&num){
返回std::abs(num)

请注意,我使用SFINAE是为了让
sanitize
函数只接受浮点数作为输入

我希望输出为0.00,而不是-0.00

我更喜欢其他答案。但在紧急关头,你总是可以使用蛮力。。。(您确定可以忽略实际结果吗?)

std::string rslt;
{
std::stringstream-ss;

ss问题是,在某个间隔[low,-0.0]内的每个浮点都将被打印“-0.00”

因此,您必须找到低:

  • 这样打印(前置(低))=>“-0.01”
  • 使打印(低)=>“-0.00”
然后,你就可以写一些东西,比如(除了nan…)

双过滤器(双x){
双低=;
返回(x<低)
?x
:((x>0.0)
?x
: 0.0) ;
}
如果您有一个正确的四舍五入printf,并管理您的算术严格符合适当的编译器标志,那么low的精确值是最接近-1/200的双精度,大于-1/200(我写的是1/200而不是-0.005,因为我说的是十进制值,而不是双精度)

正确四舍五入的sscanf(“-0.005”,“%lf”,d):双精度结果小于-1/200。我确实用精确的算法进行了检查,例如在Pharo Smalltalk语言中发现的:

[-0.005 < (-1/200) and: [-0.005 successor > (-1/200)]] assert.
[-0.005<-1/200)和:[-0.005后继者>(-1/200)]断言。
它的后继值大于-1/200(当然,上面的检查只是简单的证明)


因此,您可以编写(注意,
std::signbit
应该有帮助。为什么不将其舍入?检查输出:
if(output==“-0.00”)output=“0.00”;
(假设输出是std::string)以及浮点比较(在ieee下)比较零时忽略符号,因此-0.00==0.00。如上所述,您可以对其进行舍入,根据需要检查零和abs。@Shaggi:浮点比较将使用实际值(
-2.3E-7
),而不是舍入的-0.0。您可以解释为什么使用
find
而不是
if(ss.str()=“-0.00”)
@M.M-不。这涉及到最少的思考。比较有优势。
double filter(double x) {
    double low = ... ;
    return (x < low)
        ? x
        : ((x > 0.0)
            ? x
            : 0.0) ;
}
[-0.005 < (-1/200) and: [-0.005 successor > (-1/200)]] assert.
double filter(double x) {
    double low = 0.005 ;
    return (x <= low)
        ? x
        : ((x > 0.0)
            ? x
            : 0.0) ;
}