打印和调试时,视觉C++值会有所不同

Visual C++ values differ while printing and debugging?

本文关键字:C++ 有所不同 视觉 调试 打印      更新时间:2023-10-16

我正在检查一段代码。一切都是正确的,但我无法理解概念。

double a = 0.001;
double b = 0.001;
double c = a * b;
printf ("%lf", c);

在 Visual c++ 中调试时,当我在第三行后将鼠标指向 c 时,它显示 9.999999999999995e-007,但在打印时它显示正确的结果,即 0.000001。我想知道它在调试工具提示中显示的值以及它如何表示和转换。

这是 printf 执行舍入的结果。

printf 格式 %lf 舍入为默认精度。从我的头顶来看,我认为默认值是 6,这就是你得到 0.000001 的原因。

调试器显示双精度的实际内容。由于浮点运算的性质,0.001 * 0.001 的结果实际上不是 0.000001,而是一个近似值,尽管差异很小。

通过使用其他格式,您可以看到差异。 例如,尝试 printf("%.15e", c);

从 double/float 到字符串的转换有不同的实现,在此基础上你会得到不同的结果。我知道mos 准确的实现是std::sringstream的,我知道至少在 IOS 设备上这与printf不同。

据我所知,Visual Studio 界面是用 C# 编写的,因此您可能想研究 C# 如何将双精度转换为字符串以获得您正在寻找的答案。

拉兹万。