当前位置: 首页 > 知识库问答 >
问题:

由小于1的浮点类型表示的最大值

公冶元青
2023-03-14

有没有一种方法可以获得小于1的浮点类型float所代表的最大值。

我看到了以下定义:

static const double DoubleOneMinusEpsilon = 0x1.fffffffffffffp-1;
static const float FloatOneMinusEpsilon = 0x1.fffffep-1;

但我们真的应该这样定义这些价值观吗?

根据标准,d::numeric_limits

共有3个答案

凌鹏程
2023-03-14

0.999999403953552224609375是小于1的最大32位浮点。下面的代码演示了这一点:

Mac_3.2.57$cat float2uintTest4.c 
#include <stdio.h>
int main(void){
    union{
        float f;
        unsigned int i;
    } u;
    //u.f=0.9999;
    //printf("as hex: %x\n", u.i); // 0x3f7fffff
    u.i=0x3f800000; // 1.0
    printf("as float: %200.200f\n", u.f);
    u.i=0x3f7fffff; // 1.0-e
          //00111111 01111111 11111111 11111111
          //seeeeeee emmmmmmm mmmmmmmm mmmmmmmm
    printf("as float: %200.200f\n", u.f);

    return(0);
}
Mac_3.2.57$cc float2uintTest4.c 
Mac_3.2.57$./a.out 
as float: 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
as float: 0.99999994039535522460937500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
羊舌诚
2023-03-14

这可以通过使用C标准中规定的浮点表示的特征来计算,而不需要调用函数。由于epsilon提供了略高于1的可表示数字之间的距离,而Radix提供了用于表示数字的基数,因此略低于1的可表示数字之间的距离是epsilon除以该基数:

#include <iostream>
#include <limits>


int main(void)
{
    typedef float Float;

    std::cout << std::hexfloat <<
        1 - std::numeric_limits<Float>::epsilon() / std::numeric_limits<Float>::radix
        << '\n';
}
甄云
2023-03-14

您可以使用std::nextafter函数,该函数尽管名称不同,但可以通过使用适当的“to”参数,从算术上检索给定起点之前的下一个可表示值。

而且,事实上,当检索类型的小于1的最接近值时(在Windows上,使用Visual Studio 2019中的clang-cl编译器),答案与1-ε计算的结果不同:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>

int main()
{
    double naft = std::nextafter(1.0, 0.0);
    std::cout << std::fixed << std::setprecision(20);
    std::cout << naft << std::endl;
    double neps = 1.0 - std::numeric_limits<double>::epsilon();
    std::cout << neps << std::endl;
    return 0;
}

输出:

0.99999999999999988898
0.99999999999999977796

请注意,当使用类似技术确定大于1的最近值时,则nextafter(1.0,10000.)call给出的值与计算(1.000000000000000 22204)的值相同,这与ε的定义是一致的。

 类似资料:
  • Go语言提供了两种精度的浮点数 float32 和 float64,它们的算术规范由 IEEE754 浮点数国际标准定义,该浮点数规范被所有现代的 CPU 支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数取值范围的极限值可以在 math 包中找到: 常量 math.MaxFloat32 表示 float32 能取到的最大数值,大约是 3.4e38; 常量 math.MaxFloat64

  • 问题内容: 我想知道java类的最大大小是多少。如代码属性结构中http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546所示,代码长度指定为4个字节,因此很多。我不明白的是,异常表的pc属性是2个字节。如果代码长度超过2个字节,但异常表只能寻址2个字节,怎么办? 问题答案: 第4.8.1节JVM规范的静态

  • 我有一个程序,我需要将一个变量设置为C中最低的可表示(非无限)双精度浮点数。如何将变量设置为最低的双精度浮点值? 我尝试使用std::numeric_limits。我没有使用C 11,所以我无法尝试使用最低()函数。我尝试使用max(),但是当我尝试它时,它返回无穷大。我还尝试从max()中减去一个值,希望这样我就可以得到一个可表示的数字。 输出: 如何将上面示例中的low_值设置为最低的可表示双

  • 给定一个范围[a,b](包含两者),我需要在二进制表示中找到最大数量为“1”的最小数字。我目前的方法是找到从a到b的所有数字中设置的位数,并跟踪最大值。然而,这很慢,有更快的方法吗?

  • 本文向大家介绍PHP浮点数据类型,包括了PHP浮点数据类型的使用技巧和注意事项,需要的朋友参考一下 定义和用法 在PHP中,float数据类型表示任何数字,并带有小数部分。小数部分可以包含小数点后的数字,或者可以使用e或E以科学计数法表示。例如,科学计数法中的100是10e2。 浮点数的大小取决于硬件/ OS平台,尽管通常会精确到小数点后14位。 语法 为了更好的可读性,整数文字可以使用“ _” 

  • 2.2.3 浮点数类型 float 浮点数就是包含小数点的数,大体对应于数学中的实数集合。现实世界中的职工工资(以 元为单位)、房屋面积(以平方米为单位)、人的身高(以米为单位)、圆周率等在程序中都 适合用浮点数表示。 Python 语言提供了类型 float 用于表示浮点数。float 类型的字面值形式与数学中的 写法基本一致,但是允许小数点后面没有任何数字(表示小数部分为 0),例如下列字面值