c++ - std::cout 不打印浮点数作为例外
问题描述
为什么std::cout << 1.00000001;
打印1
到控制台?它可以正常工作1.0001
,只有在超过一定精度后才能正确停止打印。
这些数字是硬编码的,所以这个问题不是重复的。在那个问题中,由于添加了两个浮点数,所以产生了一个无理数,这意味着这些数字无法正确存储,但在我的情况下,这些数字是硬编码的,所以无法打印的原因是什么(或存储可能)一个浮点数显式初始化为1.00000001
?。它只是cout
未能打印价值还是真的是int
?
考虑以下程序
int main()
{
float num = 1.0000001f;
float num2 = num * 2;
std::cout << num;
std::cout << num2;
}
num2
打印2
但编译器没有给出关于从转换float
为int
in的警告line 2
,所以我认为那num
一定是一个float
. 这是否意味着它只是一个问题cout
?我可以安全地假设内部num
实际上是 1.0000001f
即使它打印1
到控制台吗?
我的编译器是 Visual Studio 2019 的内置编译器。
解决方案
总结我的评论:
- 数字 1.0000001 不能用浮点数表示。
- 编译器将选择一个浮点值。
- 它可以随心所欲地四舍五入(向上、向下或最接近),这是实现定义的。
所以如果你玩一下这个转换器,你可以看到在 1 之后,下一个浮点值是:
- 1
- 1.00000011920928955078125
- 1.0000002384185791015625
- 1.00000035762786865234375
- 1.000000476837158203125
- ...
1.0000001 介于前两者之间,因此您的编译器可以选择其中任何一个。在您的情况下,您的编译器似乎选择了 1。
(同样对于打印操作, cout 操作将在定义的精度后截断数字,因此它不会显示我在上面输入的完整数字 - 该精度默认为 6 位)。
推荐阅读
- json - Why am I getting this error "Unhandled Exception: type 'double' is not a subtype of type 'int'" while parsing JSOn data in flutter?
- javascript - 在 React Boilerplate 中使用 firebase-messaging-sw.js 中的环境变量
- spring-data - Thymeleaf 形式具有多个同一类的对象
- c - 来自radare2的r2ghidra-dec插件的奇怪反编译代码
- javascript - 即使在使用 https 之后,也可以在标题表单数据中看到用户凭据
- linux - 如何在 linux 的文件名末尾创建带有 & 符号的文件?
- powershell - -notmatch 运算符在 powershell 中没有给出想要的结果
- uwp - 无法从 package.manifest > Application > DisplayName in Code 获取 uwp 显示名称
- sql - 为不同时间段的每个相关记录计算 db 中的行数
- python - 如何更改 google.auth.transport.requests Python 库中的 _DEFAULT_TIMEOUT(120 秒)?