打印和调试时,视觉C++值会有所不同
Visual C++ values differ while printing and debugging?
我正在检查一段代码。一切都是正确的,但我无法理解概念。
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# 如何将双精度转换为字符串以获得您正在寻找的答案。
拉兹万。
相关文章:
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 重载函数仅在返回类型上有所不同
- 为什么括号在这个简单的代码中会有所不同
- Boost 文件在 /usr/local/include 和 /usr/include 中有所不同
- 为什么argc的输出会有所不同?
- Protobuf序列化长度在使用不同的字段值时会有所不同
- 为什么CRC计算在C和C 版本之间有所不同
- STD :: Chrono的时钟可以在不同的内核上有所不同
- Visual Studio 2015 EXP结果有所不同
- 为什么在 sizeof() 函数中与 * 运算符一起使用和不使用 * 运算符时,指向结构变量的指针大小会有所不同?
- 为什么这些直方图功能有所不同,为什么一个非确定性
- std::map 实现在 Linux 和 Windows 之间有所不同
- 切换到新编译器后,SSCANF 的工作方式有所不同
- 为什么在这种情况下星号位置有所不同,而其他位置则没有
- VC++ 异常处理在 x86 和 x64 上对于 IBPP / Firebird 客户端有所不同
- 不明确的重载函数仅在参数的模板参数上有所不同
- 自动扣除类型与尺寸的类型在Visual Studio C 和GCC之间有所不同
- 在任何方式上,所有捕获量都与完全没有试用块块有所不同
- 线程执行在IDE中和C 中的EXE应用程序中是否有所不同