对double进行转换是否始终返回相同的值?

22 c# floating-point double rounding

难道铸造doublefloat总是产生相同的结果,也可以有一些"整差异"?

例如,x

float x = (float)0.123456789d;
Run Code Online (Sandbox Code Playgroud)

总是一样的价值?

什么时候浮动加倍,然后再将其投射回浮动,即.(float)(double)someFloat

最感兴趣的是C#中的结果,但如果您对其他语言的工作原理有所了解,请随时分享.

pho*_*oog 12

除非语言偏离IEEE规范,否则结果不应取决于语言.

所有浮点数都可以精确地表示为双精度数,因此从float到double到float的往返应该产生与您开始时相同的值.

类似地,将任何double值转换为float应始终产生相同的结果,但是,当然,有许多不同的double值会截断为相同的float值.


Nic*_*rey 7

如果你垂头丧气doublefloat,你失去的精度和数据.向上转换float为a double是一种不断扩大的转换; 如果然后往返,则不会丢失任何数据...也就是说,除非您在将其向下转换回浮点之前对该值执行某些操作.

浮点数会牺牲范围的精度和精度.单精度浮点数可提供32位精度; 双精度给你64位.但它们可以表示超出基础精度指示范围的值.

C#floatdoubleIEEE 754浮点值.

尾数的有效精度比其表观大小(浮点魔法)高1位.

一些CLR浮点资源为您服务:

本文可能是关于浮点运算的危险和陷阱的规范性论文.如果您不是ACM的成员,请单击标题上的链接以查找该文章的公共下载:

  • 大卫戈德伯格.1991. 每个计算机科学家应该了解浮点运算.ACM Comput.监测网.23,1(1991年3月),5-48.DOI = 10.1145/103162.103163 http://doi.acm.org/10.1145/103162.103163

    摘要
    浮点算法被许多人认为是一个深奥的主题.这是相当令人惊讶的,因为浮点在计算机系统中无处不在:几乎每种语言都有浮点数据类型; 从PC到超级计算机的计算机都有浮点加速器; 大多数编译器都会被要求不时编译浮点算法; 几乎每个操作系统都必须响应溢出等浮点异常.本文提供了一个关于浮点方面的教程,它对计算机系统的设计者有直接影响.它首先介绍浮点表示和舍入误差,继续讨论IEEE浮点标准,最后举例说明计算机系统构建器如何更好地支持浮点.