将浮点a找出最接近浮点b的倍数

问题描述 投票:0回答:1

C ++场景:我有两个类型分别为double ab的变量。

目标:a应设置为小于ba的最接近倍数。

第一种方法:使用fmod()remainder()获得r。然后执行a = a - r。我知道,由于在内存fmod()remainder()中使用十进制数字表示,因此无法保证100%的准确性。在测试中,我发现我根本无法使用fmod(),因为其结果的差异太不可预测了(至少据我所知)。关于这个现象有很多问题和讨论。那有什么我可以做的仍然使用fmod()吗?“某物”是指一些技巧,类似于通过使用double值来检查a是否等于b

EPSILON = 0.005;
if (std::abs(a-b) < EPSILON)
   std::cout << "equal" << '\n';

我的第二种方法行得通,但似乎不是很优雅。我只是从b中减去a,直到没有什么可减去的了:

double findRemainder(double x, double y) {
    double rest;
    if (y > x)
    {
        double temp = x;
        x = y;
        y = temp;
    }

    while (x > y)
    {
        rest = x - y;
        x = x - y;
    }
    return rest;
}

int main()
{ 
   typedef std::numeric_limits<double> dbl;
   std::cout.precision(dbl::max_digits10);
   double a = 13.78, b = 2.2, r = 0;
   r = findRemainder(a, b);
   return 0;
}

对我有什么建议吗?

C ++场景:我有两个类型为double a和b的变量。目标:a应设置为小于a的b的最接近倍数。第一种方法:使用fmod()或restder()获得r。然后做一个= ...

c++ math floating-point modulo
1个回答
0
投票

嗯,确实存在定义问题,因为浮点的大多数倍数无法精确表示,除非乘数是2的幂。

© www.soinside.com 2019 - 2024. All rights reserved.