什么是最大的"非浮动"整数,可以存储在IEEE 754 double类型而不会丢失精度?
为清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:
float f0 = 0.f;
float f1 = 1.f;
Run Code Online (Sandbox Code Playgroud)
...然后将它们打印出来,我会得到0.0000和1.0000 - 完全正确.
但IEEE 754无法表示实线上的所有数字.接近于零,"差距"很小; 当你越走越远时,差距越来越大.
所以,我的问题是:对于一个IEEE 754浮点数,这是第一个(最接近零)整数,无法准确表示?我现在只关心32位浮点数,虽然如果有人给出它我会有兴趣听到64位的答案!
我认为这就像计算2 bits_of_mantissa并添加1 一样简单,其中bits_of_mantissa是标准公开的位数.我在我的机器(MSVC++,Win64)上为32位浮点数做了这个,但它看起来很好.
我有一个双值,我必须在我的UI上显示.现在条件是double = 0的十进制值,例如. - 14.0在这种情况下,我必须在我的UI上只显示14.此外,字符的最大限制为5.
例如,12.34整数值不能大于2位,因此是double的十进制值.
这可能是最好的方法吗?
我正在优化数值/统计库的排序函数,基于这样的假设:在过滤掉任何NaN并进行一些微调之后,可以将浮点数作为32位整数进行比较而不改变结果,并且可以将双精度数据进行比较64位整数.
这似乎加速了这些数组的排序大约40%,并且只要浮点数的位级表示是IEEE 754,我的假设就成立.是否存在人们实际使用的真实CPU(不包括在嵌入式设备中,这个库没有针对哪个)使用其他可能会破坏这种假设的表示?
float在使用IEEE754的系统中)double在使用IEEE754的系统中)一个double(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数的范围是该字节数的一半?
例如,8字节双精度可以完全精确地保持四字节无符号整数的范围吗?
这将归结为如果两个字节的浮点数可以保持一个字节无符号整数的范围.
一个字节的无符号int当然是0 - > 255.
虽然"我们都知道" x == y可能有问题,但在哪里x和y是浮点值,这个问题更具体一些:
int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?
r == x
Run Code Online (Sandbox Code Playgroud)
现在,因为float 的范围远大于整数的范围(但是精度不足以在边缘处唯一地呈现整数),如果对这个问题的回答也解决x了上述哪些值可以保证的话会很好. ,如果它可以得到保证.
目前我的代码正在做出这个假设(对于相对较小的x值) - 我想确保我不会被咬掉:)
这将失败,"不等于:16777217"(cast float - > int):
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if ((int)f != i) throw new Exception("not equal " + i);
}
Run Code Online (Sandbox Code Playgroud)
这个类似的代码不会失败(只有int - > float); 但是,由于转换中的丢失,有几个浮点数可以"等于"相同的整数,并且可能代表一个无声的错误:
for (int …Run Code Online (Sandbox Code Playgroud) sizeof(int)Dev Cpp虽然它在64位机器上运行,但在我身上显示4 .为什么不考虑底层硬件并显示8呢?另外,如果我编译环境也改为64位(首先是否64 bit compiler有意义?!),那么int的大小会改变吗?
是否有任何标准来决定这一点?
尝试在C中创建以下函数:
bool randBool(double bias)
Run Code Online (Sandbox Code Playgroud)
返回0或1随机返回.
绊倒我的部分是我想允许用户输入[-1.0,1.0]范围内的"偏差",这表示输出将是0或的可能性1.
以下是输入偏差应如何影响功能的几个示例:
================================================== =====
randBool(-1.0)应该0100%返回.
randBool(1.0)应该1100%返回.
randBool(-0.5)返回的可能性0比50%高1.
randBool(0.05)返回的可能性1比5%多0.
randBool(0.0)是没有更多的可能返回0比1.
================================================== =====
我几乎可以肯定这是一个概率问题,但我对这个主题并不熟悉,所以我对如何实现这个功能感到困惑.
当从大的uint64_t值转换为double时。结果并不如预期。这是为什么,有办法解决吗。我正在使用 gcc 8.3.0
int main
{
uint64_t var64 = 844421103279395000;
printf("var64 = %llu\n", var64 );
double varDouble = (double)var64;
printf("varDouble = %lf\n", varDouble );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
var64 = 844421103279395000
varDouble = 844421103279394940.000000
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么uint64_t类型无法正常显示pow(2,64)-1 .cplusplus标准是199711L.
我检查了pow()C++ 98标准下的函数
double pow (double base , double exponent);
float pow (float base , float exponent);
long double pow (long double base, long double exponent);
double pow (double base , int exponent);
long double pow (long double base, int exponent);
Run Code Online (Sandbox Code Playgroud)
所以我写了下面的代码片段
double max1 = (pow(2, 64) - 1);
cout << max1 << endl;
uint64_t max2 = (pow(2, 64) - 1);
cout << max2 << endl;
uint64_t max3 = -1;
cout << max3 << …Run Code Online (Sandbox Code Playgroud)