float
在 1.0f
和 0.0f
之间的精度有多少位,以使每个值都能被唯一表示?
例如,如果第一个小数 float
无法表示 0.13f
,则答案是 float
只有 1 位精度。
float
在 1.0f
和 0.0f
之间的精度有多少位,以使每个值都能被唯一表示?
例如,如果第一个小数 float
无法表示 0.13f
,则答案是 float
只有 1 位精度。
std::numeric_limits<float>::digits10
std::numeric_limits<float>::digits10
函数所示。float orgF = 8.589973e9;
int i = orgF;
float f = i;
assert(f == orgF);
当进行往返转换时,此项将会失败,因为该过程会更改该值。
因此,如果我们只寻找介于1.0和0.0之间的数字,则答案为7,因为最小的正数存在问题是8.589973e9。
float orgF = 8.589973e9;int i = orgF; float f= i; assert(f == orgF);
可能出错。 - Surt相对舍入误差是不均匀的
,OP想要询问 在1.0f和0.0f之间的浮点数
,而这个例子讨论了一个范围为8589973000的数字。这如何证明(我不是在反驳并且相信你的答案6是正确的和有良好的参考)在范围1.0f到0.0f中真实的数字相同?在您的编辑之后,您需要更详细地说明有效数字的数量不取决于指数。 - Mohit Jain#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
int main() {
int i = 10; /* Number of distinct number after 1 place of decimal */
int k = 1; /* Number of decimal places */
for(;/* ever */;)
{
float prev = 0.0f;
for(int j = 1; j <= i; ++j)
{
stringstream ss;
ss << "0."; /* Prepare stream with 0. followed by k digit number with leading zeroes */
ss << setfill('0') << setw(k) << j;
float next; /* Read the number */
ss >> next;
if(prev == next) return 0; /* If previous number and current number can not be distinguished */
prev = next;
}
cout << "Works for " << k << " places" << endl;
i *= 10; /* 10 times more tests to be conducted for 1 more decimal places */
k++; /* Try for more decimal places */
}
return 0;
}
代码的功能是什么
1. 设置小数点后一位的精度。 2. 将0.0与0.1、0.1与0.2……0.8与0.9以及0.9与1.0进行比较,如果其中任意一对相等(无法区分),则退出。否则,打印“适用于1位”。 3. 将小数点后两位的精度设置为2。 4. 比较0.00与0.01、0.01与0.02……0.98与0.99以及0.99与1.00,如果其中任意一对相等(无法区分),则退出。否则,打印“适用于2位”。 5. 除非退出,否则重复类似的步骤来处理3位及更多位数字。
0.00F
、0.01F
、0.02F
、0.03F
、0.04F
、0.05F
、0.06F
、0.07F
、0.08F
、0.09F
、0.10F
、0.11F
、0.12F
和0.14F
,那么我就不能唯一地表示0.13F
。这意味着如果我执行以下操作:float foo = 0.13F;
foo
将与0.12F
或0.14F
具有相同的表示形式。 - Jonathan Mee