技术总结:
今天解决了算法代码中的几个bug,
第一是之前用一个float类型的值接收两个float值的加减乘除,导致实际计算过程中出现浮点数的精度问题,而引起程序异常退出,然后改成用double类型进行接收才把问题解决。
另外一个是之前对比两个float类型的值是否相等用了qt提供的fuzzy方法,发现有些过于邻近的值被判定为同一个,导致计算错误,然后改成了相差小于1e-6就认为是同一个点。
学习笔记:
qt中的double和float精度问题
在C 中,float
和double
是两种常用的浮点数类型,但它们的表示范围和精度有所不同。以下是它们的一些关键区别:
float
- 大小:通常占用4个字节(32位)。
- 精度:大约7位十进制数字。
- 范围:大约
1.2E-38
到3.4E 38
。 - 用途:适用于空间和精度要求不高的场景,例如图形处理。
double
- 大小:通常占用8个字节(64位)。
- 精度:大约15-16位十进制数字。
- 范围:大约
2.3E-308
到1.7E 308
。 - 用途:适用于需要更高精度和更大范围的场景,例如科学计算。
解释
- 浮点数值:
- 输出表明
float
类型只能精确到约7位小数,而double
类型可以精确到约15-16位小数。
- 输出表明
- 精度和范围:
- 使用
std::numeric_limits
类,可以获取浮点数类型的精度和范围信息。 digits10
成员表示该类型可以精确表示的十进制位数。min
和max
成员表示该类型可以表示的最小值和最大值。
- 使用
- 潜在的精度差异:
- 在实际应用中,特别是涉及大量浮点运算或需要高精度的计算时,
double
类型通常比float
类型更可靠。
- 在实际应用中,特别是涉及大量浮点运算或需要高精度的计算时,
通过这些信息,你可以更好地理解float
和double
的区别,并根据具体需求选择合适的浮点数类型。
在Qt中,使用qDebug()
来输出浮点数时,你可以设置输出格式,以确保小数点后有固定的位数。为了实现这一点,你可以使用QTextStream
来格式化输出。以下是一个示例,展示如何在qDebug()
中输出小数点后固定10位的小数:
使用 QTextStream
格式化输出:
- 创建两个
QString
对象floatOutput
和doubleOutput
,用于存储格式化后的字符串。 - 创建两个
QTextStream
对象floatStream
和doubleStream
,分别与floatOutput
和doubleOutput
关联。
设置 QTextStream
的格式:
- 使用
setRealNumberNotation(QTextStream::FixedNotation)
设置为定点表示法。 - 使用
setRealNumberPrecision(10)
设置输出精度为10位小数。
将浮点数写入 QTextStream
:
- 将
floatVal
和doubleVal
写入各自的QTextStream
。
使用 qDebug()
输出格式化后的字符串:
- 将
floatOutput
和doubleOutput
输出。
// Two float values
float num1 = 1.2345678f;
float num2 = 9.8765432f;
// Multiplication results
float resultFloat = num1 * num2;
double resultDouble = num1 * num2;
// Using QTextStream to format the output
QString floatOutput, doubleOutput;
QTextStream floatStream(&floatOutput);
QTextStream doubleStream(&doubleOutput);
floatStream.setRealNumberNotation(QTextStream::FixedNotation);
floatStream.setRealNumberPrecision(10);
doubleStream.setRealNumberNotation(QTextStream::FixedNotation);
doubleStream.setRealNumberPrecision(10);
// floatStream << num1;
// doubleStream << num2;
// qDebug() << "num1: " << floatOutput;
// qDebug() << "num2: " << doubleOutput;
floatStream << resultFloat;
doubleStream << resultDouble;
qDebug() << "float: " << floatOutput;
qDebug() << "double: " << doubleOutput;