【问题标题】:Print out a really small floating-point number [duplicate]打印出一个非常小的浮点数[重复]
【发布时间】:2016-06-22 01:52:04
【问题描述】:

我有以下代码:

float test = 1/(10^(15));
std::cout << "test: " << test << std::endl;

但我得到“test: 0”作为值。我想要“测试:0.000000000000001”。

我如何做到这一点?

【问题讨论】:

  • 你可能想尝试 double 而不是 float stackoverflow.com/questions/28045787/…
  • 1/(10^(15)) -- ^ 并没有像你想象的那样做。
  • @PaulMcKenzie 可能是因为该网站建议将“c”作为标签,即使您已经编写并标记了 c++
  • @SnoozeTime:这不是问题......请记住,预期的指数是 15 的幅度 - 完全在 float 支持的 -128..127 范围内 - 而数字的不完全可表示,float 中的 23 位将做得很好。
  • @chema989 不,1e15 是double。没有integer literal 格式,中间有een.cppreference.com/w/cpp/language/floating_literal

标签: c++ floating-point floating-accuracy


【解决方案1】:

这里有多个问题。

10 ^ 15

看起来您希望“^”是指数运算符,即 10 的 15 次方。

事实并非如此。在 C 和 C++ 中,“^”是按位异或运算符。

第二个问题是表达式中的所有值都是整数值。这意味着(1/(10^15)) 的计算方式如下:

1) 10^15=5,记住^ 确实是位异或运算符。

2) 1/5=0,因为这些是整数值,这就是整数除法,这就是为什么你会得到 0 的值。

解决此问题的最佳方法是使用科学记数法:

float test = 1/(1e15);
std::cout << "test: " << test << std::endl;

科学记数法同时有两个目的:一,你得到正确的值,二,这自动是一个浮点值,所以除法是作为浮点除法进行的。

【讨论】:

  • 我将如何做一个非 10 的基数?像 7^15、7 作为我的基数和 15 作为我的指数?
  • 1e-15 可能比1/1e15 更好......
  • @daemoner119 为什么不先读一本 C++ 书籍?
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多