C++中对于浮点数的精确计算(求小数的最大公约数、最小公倍数、负小数除法)

负小数除法

在数据处理中,经常会遇到小数与小数的除法,在我最近的工作中,遇到了一个bug,排除好几天,都没有找到问题,今天一狠心抓取了所以的数据扔到excel表里,一行一行Debug,最后发现,是在处理数据时,c++精度不够,使得在小数与小数进行除法计算时,计算错误。
例如:再求位序时,(-14.49 / 0.03) + 666 与 (-14.46 / 0,03)+666的值竟然能都是184 而没有预想中的183和184。
我尝试了很多办法,包括收到四舍五入、同时扩大100倍到整数,即(-1449 / 3 )/100这种方法,在某些时候,比如下述我会讲的小数与小数求最小公倍数、最大公约数时,这种方法就可以使用,但是在这里,他并没有成功的进行运算,所得值还是184。
最后我发现在进行负数计算时,-14.49 / 0.03他所得的值不是-483,而是-482.66666666666,在使用(int)强制将其转换为整型或者进行单纯的四舍五入后,它会被转换为-482而不是我们所需要的-483,因此在我的数据中,会导致有两个在索引184处进行操作,而在索引183处没有进行计算和赋值,由此导致的bug。
为了解决这个问题,我使用了c++中的floor函数,如下代码块所示

int da = (int)(data * 100);
int chu = 3;
int index = num_0 + static_cast<int>(std::floor(da/chu));

为了尽可能的提高精度和当时尝试了所以的办法,我还是将其进行了整数倍100的扩大,然后使用了std::floor()函数,关于这个函数的作用及功能如下:
std::floor()函数是C++标准库中的一个数学函数,位于头文件中。它的作用是将一个浮点数向下取整,返回不大于参数的最大整数值。
具体来说,std::floor()函数会将输入的浮点数舍去小数部分,只保留整数部分。它返回的是一个double或float类型的值,表示向下取整后的结果。
例如,std::floor(3.14)的结果是3.0,std::floor(-2.5)的结果是-3.0,std::floor(7.9)的结果是7.0。
在代码中,std::floor()函数常常用于将浮点数转换为整数,并且进行向下取整操作。由此解决了我对一些特殊数据计算时遇到的问题。

求小数的最大公约数和最小公倍数

// 求最大公约数
double findGCD(double num1, double num2) {
    if (num2 == 0) {
        return num1;
    }
    return findGCD(num2, fmod(num1, num2));
}

// 求最小公倍数
double findLCM(double num1, double num2) {
    double gcd = findGCD(num1, num2);
    double lcm = (num1 * num2) / gcd;
    return lcm;
}
    double public_num = 0.03 * 100;
 //   double deta_x = delta_time;//根据求出来的t来做变换,再此假设为0.2
    double deta_x = 0.2 * 100;
    double const_public_num = 0.03 * 100;
    double const_public_x = 0.2 * 100;
    double min_common_multiple = findLCM(public_num, deta_x) / 100; //最小公倍数

其实大致上,与整数型求最大公约数、最小公倍数一样,但是需要你对需要计算的小数进行一定比例的扩大,我建议扩大的整型的十倍,比如0.03 最好扩大到30也就是1000倍最后,再根据放大倍数将结果进行相除,以此来得到小数的具体的最大公约数和最小公倍数。如果需要整型的,也可直接套用我的代码,忽略比例放大即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 最大公因数是指两个或多个整数共有约数最大的一个数,可以使用欧几里得算法(辗转相除法)来解。 最小公倍数是指两个或多个整数公有的倍数最小的一个数,可以通过先出最大公因数,然后用两数之积除以最大公因数来解。 ### 回答2: Python是一种简洁而强大的编程语言,可以轻松实现许多算法和数学操作,包括最大公因数和最小公倍数。 最大公因数(GCD)指两个或多个数的最大公约数,可以使用欧几里得算法计算。简单来说,欧几里得算法就是反复地将两个数较大的数除以较小的数,直到余数为0为止,此时较小的数就是它们的最大公约数。 因此,我们可以使用Python来实现欧几里得算法,例如: ``` def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) ``` 这个函数接受两个参数a和b,递归地将b和a%b(即a除以b的余数)作为参数传递,直到b为0为止,此时a就是最大公约数最小公倍数(LCM)指两个或多个数的最小公倍数,可以用它们的乘积除以它们的最大公约数计算。因此,我们可以使用gcd函数来计算最小公倍数,例如: ``` def lcm(a, b): return a * b / gcd(a, b) ``` 这个函数接受两个参数a和b,先计算最大公约数,然后将a和b的乘积除以最大公约数得到最小公倍数。 使用这些函数需要注意的是,它们的参数应该是整数,如果使用浮点数则可能导致计算错误。另外,在计算最小公倍数时,可能会产生很大的整数,超出了Python的整数表示范围,因此需要使用其他方法来处理。 ### 回答3: 最大公因数和最小公倍数是数学常见的概念,最大公因数和最小公倍数的方法有很多种,包括辗转相除法、欧几里得算法、质因数分解法等。在 Python ,我们可以利用这些方法来解。 一、辗转相除法 辗转相除法,也叫欧几里得算法,是最大公因数的一种方法。这个算法的核心思想是将较大的数除以较小的数,再用余数作为被除数继续进行除法运算,直到余数为零,此时最后的被除数就是最大公因数。 以两个数的最大公因数为例,代码如下: ```python def gcd(x, y): while y: x, y = y, x % y return x ``` 其,`x` 和 `y` 是需要得最大公因数的两个数。 二、质因数分解法 质因数分解法是最小公倍数和最大公因数的一种方法。其核心思想是将每个数分解成质数乘积的形式,再将这些质数乘积重复的部分取最大值作为最大公因数,取不重复的部分乘起来作为最小公倍数。 以两个数的最大公因数和最小公倍数为例,代码如下: ```python def prime_factors(n): i = 2 factors = [] while i * i <= n: if n % i: i += 1 else: n //= i factors.append(i) if n > 1: factors.append(n) return factors def gcd(x, y): x_factors = prime_factors(x) y_factors = prime_factors(y) intersection = list(set(x_factors) & set(y_factors)) product = 1 for factor in intersection: product *= factor return product def lcm(x, y): x_factors = prime_factors(x) y_factors = prime_factors(y) union = set(x_factors) | set(y_factors) product = 1 for factor in union: product *= factor return product ``` 其,`prime_factors` 函数是质因数分解的函数,`gcd` 和 `lcm` 函数分别是最大公因数和最小公倍数的函数,`x` 和 `y` 是需要得最大公因数和最小公倍数的两个数。 三、小结 本文详细介绍了 Python 最大公因数和最小公倍数的几种方法,包括辗转相除法和质因数分解法。不同的方法适用于不同的场合,需要根据具体问题进行选择。同时,Python 有很多内置函数可以方便地完成这些计算,比如 `math.gcd` 函数可以直接最大公因数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值