我正在检查一段代码。一切都是正确的,但我无法理解的概念。
double a = 0.001;
double b = 0.001;
double c = a * b;
printf ("%lf", c);
在 Visual c++ 中调试时,当我在第 3 行之后将鼠标指向 c 时,它显示 9.999999999999995e-007,但在打印时显示正确结果,即 0.000001。我想知道它在调试工具提示中显示的实际值以及它是如何表示和转换的。
我正在检查一段代码。一切都是正确的,但我无法理解的概念。
double a = 0.001;
double b = 0.001;
double c = a * b;
printf ("%lf", c);
在 Visual c++ 中调试时,当我在第 3 行之后将鼠标指向 c 时,它显示 9.999999999999995e-007,但在打印时显示正确结果,即 0.000001。我想知道它在调试工具提示中显示的实际值以及它是如何表示和转换的。
这是 printf 执行舍入的结果。
printf 格式 %lf 舍入到默认精度。从我的脑海中,我认为默认值为 6,这就是你得到 0.000001 的原因。
调试器显示双精度的实际内容。由于浮点运算的性质,0.001 * 0.001 的结果实际上并不是 0.000001,而是一个近似值,尽管差异很小。
通过使用其他格式,您可以看到差异。例如尝试 printf("%.15e", c);
从 double/float 到字符串的转换有不同的实现,基于此,您将获得不同的结果。我知道的最准确的实现是std::sringstream
并且我知道这printf
至少与 IOS 设备不同。
据我所知,Visual Studio 界面是用 C# 编码的,因此您可能想了解 C# 如何将双精度转换为字符串以获得您正在寻找的答案。
拉兹万。