精华内容
下载资源
问答
  • 除了在您的情况下,浮点数不是IEEE 754二进制64(“双精度”)浮点数,而是IEEE 754二进制32(“单精度”)浮点数.仅仅为了记录,我当然应该指出,检索原始字符串表示是不可能的,因为例如字符串’0.10′,’0.1′,’1e-1’和...

    您正在寻找解决Python的repr解决的基本相同的问题,即找到舍入到给定float的最短十进制字符串.除了在您的情况下,浮点数不是IEEE 754二进制64(“双精度”)浮点数,而是IEEE 754二进制32(“单精度”)浮点数.

    仅仅为了记录,我当然应该指出,检索原始字符串表示是不可能的,因为例如字符串’0.10′,’0.1′,’1e-1’和’10e-2’都被转换为相同的float(或者在本例中为float32).但是在合适的条件下,我们仍然可以希望生成一个与原始字符串具有相同十进制值的字符串,这就是我将在下面做的.

    您在答案中概述的方法或多或少有效,但可以简化一些.

    首先,一些界限:当涉及单精度浮点数的十进制表示时,有两个幻数:6和9.6的重要性是任何(不太大,不太小)十进制数字字符串具有6个或更少有效十进制数字将通过单精度IEEE 754浮点数正确往返:即,将该字符串转换为最近的float32,然后将该值转换回最接近的6位十进制字符串,将产生一个与原始值相同的字符串.例如:

    >>> x = "634278e13"

    >>> y = float(np.float32(x))

    >>> y

    6.342780214942106e+18

    >>> "{:.6g}".format(y)

    '6.34278e+18'

    (这里,“不太大,不太小”我只是意味着应该避免float32的下溢和溢出范围.上面的属性适用于所有正常值.)

    这意味着对于您的问题,如果原始字符串有6个或更少的数字,我们可以通过简单地将值格式化为6位有效数字来恢复它.因此,如果你只关心恢复首先有6个或更少有效小数位的字符串,你可以在这里停止阅读:一个简单的'{:.6g}’.format(x)就足够了.如果您想更一般地解决问题,请继续阅读.

    对于另一个方向的往返,我们有相反的属性:给定任何单精度浮点数x,将该浮点数转换为9位十进制字符串(舍入到最接近,一如既往),然后将该字符串转换回单个 – 精确浮点数,将始终精确恢复该浮点数的值.

    >>> x = np.float32(3.14159265358979)

    >>> x

    3.1415927

    >>> np.float32('{:.9g}'.format(x)) == x

    True

    与您的问题的相关性是,总是至少有一个9位数的字符串向x舍入,因此我们永远不必超过9位.

    现在我们可以按照您在答案中使用的相同方法:首先尝试6位数字符串,然后是7位数字,然后是8位数字.如果这些都不起作用,那么9位数的字符串肯定会由上面的字符串组成.这是一些代码.

    def original_string(x):

    for places in range(6,10): # try 6,7,8,9

    s = '{:.{}g}'.format(x,places)

    y = np.float32(s)

    if x == y:

    return s

    # If x was genuinely a float32,we should never get here.

    raise RuntimeError("We should never get here")

    示例输出:

    >>> original_string(0.02500000037252903)

    '0.025'

    >>> original_string(0.03999999910593033)

    '0.04'

    >>> original_string(0.05000000074505806)

    '0.05'

    >>> original_string(0.30000001192092896)

    '0.3'

    >>> original_string(0.9800000190734863)

    '0.98'

    但是,上面提到了一些警告.

    >首先,对于我们使用的关键属性,我们必须假设np.float32始终执行正确的舍入.这可能是也可能不是,取决于操作系统. (即使在相关操作系统调用声称被正确舍入的情况下,仍可能存在声称无效的极端情况.)在实践中,np.float32可能足够接近正确舍入而不会导致问题,但为了完全放心,你想要知道它是正确的圆形.

    >其次,上述不适用于低于正常范围的值(因此对于float32,任何小于2 ** – 126的值).在低于正常范围内,6位十进制数字字符串将通过单精度浮点数正确往返是不正确的.如果你关心次正规,你需要在那里做一些更复杂的事情.

    >第三,上面有一个非常微妙(和有趣!)的错误几乎无关紧要.我们使用的字符串格式总是将x舍入到最接近的位数 – 数字十进制字符串到x的真值.但是,我们想知道是否有任何位数 – 数字十进制字符串回转到x.我们隐含地假设(看似显而易见的)事实,即如果有任何位数 – 数字十进制字符串舍入到x,则最接近的位数 – 数字十进制字符串舍入到x.这几乎是正确的:从属性得出的是,围绕x的所有实数的区间在x周围是对称的.但是这种对称性在一种特定情况下失败,即当x是2的幂时.

    因此,当x是2的精确幂时,(例如)最接近x的最接近的8位十进制字符串可能(但不太可能)不会舍入到x,但是仍然有一个8位十进制字符串舍入到x.你可以对float32范围内发生这种情况的情况进行详尽的搜索,结果发现正好有三个x值,即x = 2 ** – 96,x = 2 ** 87并且x = 2 ** 90.对于7位数字,没有这样的值. (对于6位和9位数字,这种情况永远不会发生.)让我们仔细看看x = 2 ** 87的情况:

    >>> x = 2.0**87

    >>> x

    1.5474250491067253e+26

    我们将最接近的8位十进制值取为x:

    >>> s = '{:.8g}'.format(x)

    >>> s

    '1.547425e+26'

    事实证明,这个值不会回到x:

    >>> np.float32(s) == x

    False

    但是它的下一个8位十进制数字符号确实如下:

    >>> np.float32('1.5474251e+26') == x

    True

    同样,这是x = 2 ** – 96的情况:

    >>> x = 2**-96.

    >>> x

    1.262177448353619e-29

    >>> s = '{:.8g}'.format(x)

    >>> s

    '1.2621774e-29'

    >>> np.float32(s) == x

    False

    >>> np.float32('1.2621775e-29') == x

    True

    因此,在所有20亿左右的正常单精度值中忽略次正规和溢出,恰好有三个值x,上述代码不起作用. (注意:我原本以为只有一个;感谢@RickRegan指出评论中的错误.)所以这是我们的(略带舌头)固定代码:

    def original_string(x):

    """

    Given a single-precision positive normal value x,return the shortest decimal numeric string which produces x.

    """

    # Deal with the three awkward cases.

    if x == 2**-96.:

    return '1.2621775e-29'

    elif x == 2**87:

    return '1.5474251e+26'

    elif x == 2**90:

    return '1.2379401e+27'

    for places in range(6,we should never get here.

    raise RuntimeError("We should never get here")

    展开全文
  • 在C语言中可以精度型和双精度型两种形式表示实型常量,分别e68a843231313335323631343130323136353331333431376561类型名float和double进行定义。实型常量在一般的微型集中占用4个字节,一般形式或者指数形式...

    展开全部

    实型常量又称实数或浮点数。在C语言中可以用单精度型和双精度型两种形式表示实型常量,分别用e68a843231313335323631343130323136353331333431376561类型名float和double进行定义。

    实型常量在一般的微型集中占用4个字节,一般形式或者指数形式,数值范围都是-1038~1038,有效数字是7位。

    浮点型数据又分为单精度型(float)和双精度型(double)两种。

    1、单(float):占用比特数32,有效数位6-7,数值范围(-3.4e-38~3.4e+38)

    2、双(double):占用比特数64,有效数位15-16,数值范围(-1.7e-308~1.7e+308)

    扩展资料

    c语言中,数据类型分为整形、实型和指针类型(以下内容均表示在32位操作系统中):

    其中整形分为char,shortint,longint,longlong,各种类型的使用,前面都可以加上unsigned表示无符号char字符类型,表示的大小为-128~127,大小为一个字节;

    其中0-127被编为ASCⅡ码shortint短整形-65536~655352个字节longint整形-20亿多~20亿多4个字节longlong长整型8个字节longint通常写为int代表的是CPU字长;

    在32为操作系统中cpu的字长是32位,即4个字节实行(浮点型)分为float和double:float6~7位有效数字4个字节double15~16位有效数字8个字节在现代CPU中,有一个协处理器专门进行浮点数的运算;

    然后根据类型进行精度截取指针类型32位无符号整数,即unsignedint,但是它只能表示内存中一个比特的空间的编号注:32位CPU的内存寻址范围是从32个0到32个1,总计4GB,所以,32位操作系统最高只支持4G内存。

    展开全文
  • 在这种情况下,两个操作数都被视为双精度。 同样,以下语句也不会引发任何异常。 double div1 = 0D/0; //or 0D/0D double div2 = 0/0D; //or 0D/0D System.out.printf("div1 = %s : div2 = %s%n", div1, div2); ...

    下面的语句java.lang.ArithmeticException: / by zero很明显。

    System.out.println(0/0);

    因为文字0被视为int文字,并且在整数算术中不允许除以零。

    但是,以下情况不会引发类似的任何异常java.lang.ArithmeticException: / by zero。

    int a = 0;

    double b = 6.199;

    System.out.println((b/a));

    显示Infinity。

    以下语句NaN无例外地产生(非数字)。

    System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.

    在这种情况下,两个操作数都被视为双精度。

    同样,以下语句也不会引发任何异常。

    double div1 = 0D/0; //or 0D/0D

    double div2 = 0/0D; //or 0D/0D

    System.out.printf("div1 = %s : div2 = %s%n", div1, div2);

    System.out.printf("div1 == div2 : %b%n", div1 == div2);

    System.out.printf("div1 == div1 : %b%n", div1 == div1);

    System.out.printf("div2 == div2 : %b%n", div2 == div2);

    System.out.printf("Double.NaN == Double.NaN : %b%n", Double.NaN == Double.NaN);

    System.out.printf("Float.NaN == Float.NaN : %b%n", Float.NaN == Float.NaN);

    它们产生以下输出。

    div1 = NaN : div2 = NaN

    div1 == div2 : false

    div1 == div1 : false

    div2 == div2 : false

    Double.NaN == Double.NaN : false

    Float.NaN == Float.NaN : false

    它们都返回false.为什么用浮点数或双精度数允许此操作(除以零)?

    顺便说一下,我可以理解,浮点数(双精度数)的值代表正无穷大, 负无穷大,而不是数字(NaN)...

    展开全文
  • double属于双精度浮点数据(8字节)。 float属于单精度型浮点数据(4字节)。 二、浮点型计算为什么会丢失 任何一个数字,在java底层表示都必须转换成科学计数法\color{red}科学计数法科学计数法来表示, 计算机是...

    一、浮点数值类型

    在java当中主要有两种浮点类型float\color{red}float以及double\color{red}double两种,而浮点也就是我们的小数点。

    double属于双精度型浮点数据(8字节)。

    float属于单精度型浮点数据(4字节)。

    二、浮点型计算为什么会丢失

    任何一个数字,在java底层表示都必须转换成\color{red}科学计数法来表示,
    计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,所以有些浮点数运算也会产生一定的误差。

    三、解决方案

    对于这个问题,在java当中可以使用BigDecimal\color{red}BigDecimal类来进行解决

    public BigDecimal(double val) //将double表示形式转换为BigDecimal (不建议使用)
    public BigDecimal(int val) //将int表示形式转换成BigDecimal
    public BigDecimal(String val) //将String表示形式转换成BigDecimal
    

    为什么不建议使用double作为构造参数的方法呢?

    double的构造方法结构是具有一定的不可预知性的,因为计算机无法准确的表示浮点数,反之亦然,我们的double型0.1对于计算机来说并不是,对于计算机来说它认为的0.1其实是0.1000000000000000055511151231257827021181583404541015625。

    String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,通常建议优先使用String构造方法,当double必须用作BigDecimal的源时,使用Double.toString(double)转成String,再进行使用。

    新对象

    BigDecimal在进行每一步运算时,都会产生一个新的对象。原对象不变。

    展开全文
  • c#入门-浮点

    2020-12-24 07:33:51
    double,双精度浮点型,8字节 decimal,高精度浮点型,16字节 他们没有无符号变种 常用类型是double double是8字节的数据,那么他能储存的上限是多少呢 和long一样是263-1? 他的上限是1后面跟308个0 为什么会这么...
  • 浮点数量化为定点1. 这篇博客将要讨论什么? 说来惭愧,作为计算机科班出身的人,计算机基础知识掌握并不扎实,这里的基础指的是计算机体系结构中的内容,诸如数据的表示和处理,如float的表示和运算等。看《CSAPP》...
  • Java中的浮点

    2020-11-15 16:45:21
    double是双精度 double更精确 比如说“ 10.0 / 3 如果采用float来存储,结果可能是3.33333 如果采用double来存储,结果可能是3.333333333 但需要注意的是,如果需要在财务软件方面 double也是远远不够的 在Java中...
  • 【C++复习四】浮点型数据double、float

    千次阅读 2013-03-31 11:49:07
    以前呢,只知道double是双精度的,而float是单精度的,却没有深究是为什么,以及双精度和单精度都是指什么。 最近看了一些网上的解释,略有心得。 首先,探讨一下存储结构。 浮点数是以科学计数法存储的。科学...
  • 双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要java.math.BigDecimal。BigDecimal所创建的是...
  • 正确结果是 57,而不是 58浮点运算惹的祸其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。而PHP会区分 int 还是 float。不管什么语言...
  • 浮点型:至少包含一个小数点,java中有两种:float单精度、double双精度1.内存占用 一个float数值占用4个字节、32位 一个double数值占用8个字节、64位 因此,能float尽量不用double。2.范围 float -2^128 ~ 2^127...
  • PHP高精度计算

    2020-12-16 10:28:45
    其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。 而PHP会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的...
  • double双精度浮点型,64位;char字符型,16位;还有boolean布尔型。一共就这几种,那么有哪几种基本类型可以表示数字呢?很明显byte,short,int,long,float,double都是可以的,问题就在char和boo...
  • float是浮点型,double是double float的意思,也就是双精度浮点型。%f是以float类型格式化输入或输出,%lf是long float的意思(估计是和%ld对应),也就是指double类型。scanf读%f时,系统会按照4字节长度来读,读完要...
  • 正确结果是 57,而不是 58浮点运算惹的祸其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。而PHP会区分 int 还是 float。不管什么语言...
  • 今天在数值计算时碰到一个问题.程序如下: double a = (3.3-2.4)/0.1; System.out.println(a);... 十进制数的二进制表示可能不够精确浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法
  • java中浮点数的计算 今天在数值计算时碰到一个问题.程序如下:  ... 十进制数的二进制表示可能不够精确 浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法十进制来
  • 想必大家都知道,显卡巨头Nvidia公司的产品可以分为三大...FP64双精度浮点计算能力强   对于专业卡而言,仅强调FP32单精度运算速度是不够的,毕竟进行生化模拟,比如化学分析和生物遗传学对数学精度的要求远远高...
  • false 前置知识在强类型语言中,整数和小数是区分对待的,整数整型,小数用浮点型目前有两种显示浮点数的方法:单精度和双精度,在进行浮点运算时,单精度使用 32 位,而双精度使用 64 位。本文对浮点型简略带过,...
  • 展开全部js中的数字都是浮点数表示62616964757a686964616fe78988e69d8331333337396234的,并规定使用IEEE754标准的双精度浮点数表示。IEEE754规定了两种基本浮点格式:单精度和双精度。IEEE单精度格式具有24位有效...
  • IEEE754

    多人点赞 2020-07-13 22:39:42
    一、定义:什么是IEEE754 IEEE754标准中规定float单精度浮点数在机器中表示 1 位表示数字的符号,...双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023; 注:单精度偏移量: 01111111 转成十进制 .
  • false 前置知识在强类型语言中,整数和小数是区分对待的,整数整型,小数用浮点型目前有两种显示浮点数的方法:单精度和双精度,在进行浮点运算时,单精度使用 32 位,而双精度使用 64 位。本文对浮点型简略带过,...
  • 数据类型分类:数字型— Integer(整型)、Long(长整型)、Single(单精度浮点型)、Double(双精度浮点型)和 Currency(货币型)。数据库中的十种数据类型都是什么Character 数据类型 Character 数据类型用来存储字母数字...
  • 举个例子double 是双精度浮点基本数据类型 而Double是双精度数据的类Java为每个基本类型提供封装类;Double是基本类型double的封装类.区别在于Double的默认值为null,而double的默认值为0.0d追问-那么Double和double...
  • 有关Java浮点数精度丢失的一个有趣的例子以及尚未解决的疑惑 本文章重点在于表述最后的例子和尚未解决的疑问,故对于浮点数...IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。 IEEE 754 科学记数法以...
  • C语言学习笔记7

    2020-02-23 23:13:18
    我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。这些基本数据类型声明变量通常是这样: 既然枚举也是一种数据类型,那么它和基本数据类型一样...
  • 运算符重载

    千次阅读 2016-07-18 18:04:00
     运算符也可以重载,像我们平时使用的+运算符,对整形,单精度浮点型,双精度浮点型都能实现加法运算。又如,>(右移),在输入操作中与流对象cin配合使用实现输入操作。  在C++程序中,用户不能直接C++提供的...
  • 1.什么是变量:在程序运行过程中它的值是允许改变的量2.java中常的数据类型分为四类八种 第一类:整型 int(整数类型) byte(字节类型) short(短整形) long(长整形) 第二类:浮点型 double(双精度类型 双精度) float...
  • 1.什么是变量:在程序运行过程中它的值是允许改变的量 2.java中常的数据类型分为四类八种 第一类: 整型 int(整数类型) ...float(浮点类型 单精度 //CPU处理单精度浮点数的速度比处理双精度...
  • 1、什么是BigDecimal类?BigDecimal有什么作用呢?为什么BigDecimal来进行计算呢?...3)双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

双精度浮点用什么