负小数除法
在数据处理中,经常会遇到小数与小数的除法,在我最近的工作中,遇到了一个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倍最后,再根据放大倍数将结果进行相除,以此来得到小数的具体的最大公约数和最小公倍数。如果需要整型的,也可直接套用我的代码,忽略比例放大即可。