Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 一个简单的计算错误_Scala_Math_Operation - Fatal编程技术网

Scala 一个简单的计算错误

Scala 一个简单的计算错误,scala,math,operation,Scala,Math,Operation,嗨,我是Scala的新手,下面的行为真的很奇怪。Scala在这个简单的计算中也犯了错误吗?还是我做错了什么? 谢谢 Scala中的Double是一个64位IEEE-754浮点数,相当于Java的双原语类型,如中所述 根据的性质,Double不一定返回数字的精确值。它归结为一个事实,小数不能总是精确地表示为二进制 斯卡拉,是一个64位IEEE-74浮点数,相当于java的双原语类型,如中所描述的。 根据的性质,Double不一定返回数字的精确值。它归结为一个事实,小数不能总是精确地表示为二进制 为

嗨,我是Scala的新手,下面的行为真的很奇怪。Scala在这个简单的计算中也犯了错误吗?还是我做错了什么? 谢谢


Scala中的
Double
是一个64位IEEE-754浮点数,相当于Java的双原语类型,如中所述

根据的性质,
Double
不一定返回数字的精确值。它归结为一个事实,小数不能总是精确地表示为二进制


<>斯卡拉,是一个64位IEEE-74浮点数,相当于java的双原语类型,如

中所描述的。 根据的性质,
Double
不一定返回数字的精确值。它归结为一个事实,小数不能总是精确地表示为二进制


为了更好的精度,您可能需要考虑使用.< /P> < P>实数表示为浮点(32位)和双(64位)。这些是二进制格式,只大致表示实数的完整范围。实数包括所有(可数无限)和(不可数无限)。Double充其量只能表示有理数的一个小的有限子集

双精度浮点编码使用53位尾数(显式存储52位)、11位指数和1位符号。了解IEEE双精度浮点

可以精确表示的整数范围为+/-2^53-1,而指数表示的范围为10^+/-308

  • 不能在| x |>2^53处精确表示整数x

  • 不能精确地表示形式不是k/2^n的分数,其中k,n是整数(k,n在上述限制范围内)。因此,您不能表示1/3、1/5、1/7、1/11等

  • 分母相对素数为2的任何有理分式都不能精确表示。任何分数k/P,其中P是除2以外的素数的乘积,k不是P的倍数,都不能用IEEE-754浮点精确表示

您观察到的行为是由于1/5被近似表示,并且从内部双精度/浮点表示到字符表示的转换执行舍入到某种精度。所有使用机器浮点(double/float)的语言都表现出类似的行为,但是从float转换为print的例程可能会对这些近似数字进行不同的舍入


由于实数是,有理数是,几乎所有实数都是无理的。

实数由浮点(32位)和双精度(64位)表示。这些是二进制格式,只大致表示实数的完整范围。实数包括所有(可数无限)和(不可数无限)。Double充其量只能表示有理数的一个小的有限子集

双精度浮点编码使用53位尾数(显式存储52位)、11位指数和1位符号。了解IEEE双精度浮点

可以精确表示的整数范围为+/-2^53-1,而指数表示的范围为10^+/-308

  • 不能在| x |>2^53处精确表示整数x

  • 不能精确地表示形式不是k/2^n的分数,其中k,n是整数(k,n在上述限制范围内)。因此,您不能表示1/3、1/5、1/7、1/11等

  • 分母相对素数为2的任何有理分式都不能精确表示。任何分数k/P,其中P是除2以外的素数的乘积,k不是P的倍数,都不能用IEEE-754浮点精确表示

您观察到的行为是由于1/5被近似表示,并且从内部双精度/浮点表示到字符表示的转换执行舍入到某种精度。所有使用机器浮点(double/float)的语言都表现出类似的行为,但是从float转换为print的例程可能会对这些近似数字进行不同的舍入


由于实数是有理数,几乎所有实数都是无理数。

哪里有错?像100这样的实数只有在用浮点表示时才近似。这可能有助于找出错误所在?像100这样的实数只有在用浮点表示时才近似。这可能会有帮助
scala $ Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> val radius:Double = 10.2
radius: Double = 10.2

scala> radius * 10
res0: Double = 102.0

scala> radius * 100
res1: Double = 1019.9999999999999

scala> radius * 1000
res2: Double = 10200.0