C++如何判断两个浮点型值相等
时间: 2023-10-08 13:06:33 浏览: 76
在++中,判断两个浮点数是否相等有一定的难度,因为浮点数在内存中的表示是有限的,而且存在舍入误差。因此,使用等号(==)判断两个浮点数是否相等可能会得到错误的结果。
一种可行的方法是判断两个浮点数的差值是否在一个非常小的范围内,如果是,则认为它们相等。例如,可以定义一个非常小的常量EPSILON,然后使用以下代码判断两个浮点数a和b是否相等:
```c++
const double EPSILON = 1e-6;
if (fabs(a - b) < EPSILON) {
// a和b的值相等
} else {
// a和b的值不相等
}
```
需要注意的是,由于浮点数的表示存在舍入误差,因此EPSILON的取值需要根据具体情况进行调整。
相关问题
c++高精度减法浮点型 不用函数
不使用函数的高精度浮点数减法可以按照以下步骤进行:
1. 将浮点数转化为字符串形式
2. 找到小数点位置,并计算出小数点前和小数点后的位数
3. 分别补足小数点前和小数点后的0,使两个浮点数的小数点前和小数点后的位数相等
4. 去掉小数点
5. 从字符串的最后一位(也就是从小数点后面的数字开始)开始,按照高精度减法的方法计算两个数的差,注意进位和借位
6. 处理结果,加上小数点,去掉前导0,翻转字符串,转化为浮点数
代码实现如下:
```c++
#include <iostream>
#include <string>
#include <algorithm> // for reverse()
using namespace std;
int main() {
string a = "123.456";
string b = "78.9";
// 找到小数点位置
int dotPosa = a.find('.');
int dotPosb = b.find('.');
// 计算小数点前和小数点后的位数
int lenDeca = (dotPosa == -1 ? 0 : a.length() - dotPosa - 1);
int lenDecb = (dotPosb == -1 ? 0 : b.length() - dotPosb - 1);
int lenInta = (dotPosa == -1 ? a.length() : dotPosa);
int lenIntb = (dotPosb == -1 ? b.length() : dotPosb);
// 补足小数点前的0
if (lenInta < lenIntb) {
a.insert(0, lenIntb - lenInta, '0');
} else if (lenIntb < lenInta) {
b.insert(0, lenInta - lenIntb, '0');
}
// 补足小数点后的0
if (lenDeca < lenDecb) {
a.append(lenDecb - lenDeca, '0');
} else if (lenDecb < lenDeca) {
b.append(lenDeca - lenDecb, '0');
}
// 去掉小数点
a.erase(dotPosa, 1);
b.erase(dotPosb, 1);
// 翻转字符串
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
// 高精度减法
string c = "";
int carry = 0;
for (int i = 0; i < a.length(); i++) {
int numa = a[i] - '0';
int numb = (i < b.length() ? b[i] - '0' : 0);
int numc = numa - numb - carry;
if (numc < 0) {
numc += 10;
carry = 1;
} else {
carry = 0;
}
c += (char)(numc + '0');
}
// 去掉前导0
while (c.length() > 1 && c.back() == '0') {
c.pop_back();
}
// 加上小数点
if (lenDeca > 0) {
c.insert(lenDeca, ".");
}
// 翻转回来
reverse(c.begin(), c.end());
// 输出结果
cout << c << endl;
return 0;
}
```
注意,在这个例子中,我们没有考虑负数的情况。如果需要处理负数,可以在高精度减法的过程中,先判断两个数的大小关系,再决定是否需要加上负号。
用重载写一个比较两个数大小的c++程序
在 C++ 中,你可以使用函数重载(Function Overload)来创建几个具有相同名称但参数列表不同的函数,以便分别处理整数、浮点数或其他类型的数值比较。下面是一个简单的例子,展示了如何编写用于比较两个数大小的重载函数:
```cpp
#include <iostream>
// 比较两个整数的大小
int compareInt(int a, int b) {
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0; // 相等
}
// 比较两个浮点数的大小,考虑到浮点精度问题
float compareFloat(float a, float b) {
if (a > b)
return 1;
else if (a < b)
return -1;
else
return 0; // 相等
}
// 主函数示例
int main() {
int num1 = 5, num2 = 3;
std::cout << "Compare Integers: " << compareInt(num1, num2) << std::endl;
float flt1 = 3.14159, flt2 = 3.1416;
std::cout << "Compare Floats: " << compareFloat(flt1, flt2) << std::endl;
return 0;
}
```
在这个例子中,`compareInt` 和 `compareFloat` 都叫做 `compare`,但由于它们接受不同类型的数据,编译器可以根据传入的参数自动识别并调用正确的函数。
阅读全文