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

为什么非strictfp模式下的转换被视为丢失信息的转换?

华阳秋
2023-03-14

据我所知,strictfp模式下的转换用于便携性,而不是本问题中提到的准确性。然而,Java语言规范JavaSE8版本说

从float到double的非strictfp加宽原语转换可能会丢失有关转换值的总体大小的信息。

在我看来,严格tfp的拓宽原始转换是为了精确。此外,我怀疑双可以代表浮点数可以接受的所有值,在这种情况下,我看不出为什么从浮点数到双的转换是一个问题。

编辑:

措辞“…可能会丢失有关…的信息”在规范中,我感觉在非strictfp模式下的转换比在strictfp模式下的转换更精确。这对我来说没有意义,因为在非strictfp模式下的转换可能会以更高的精度使用中间值。这个问题最初是基于这种理解编写的,看起来可能不像您预期的那样令人满意。

共有1个答案

华哲茂
2023-03-14

Intel的IA64体系结构使用固定浮点寄存器格式、一个符号位、17个指数位和64个有效位。当浮点数从其中一个寄存器存储到32位或64位变量中时,必须对其进行转换。

Java旨在获得一致的结果,因此不希望表达式的值根据中间结果是保存在寄存器中还是作为内存中浮点数或双倍数而改变。

最初,Java只是坚持所有计算都要像存储所有中间结果一样进行。由于很难在每次计算中强制指数进入正确的范围,这导致性能不佳。解决方案是让程序员在完全一致的严格tfp模式和更宽松的模式之间做出选择,在这种模式下,指数可以超出表达式类型的范围,而不会将值强制为零或无穷大。

假设在松弛模式下,寄存器内浮点的指数超出双指数范围,并且正在转换为内存内双指数。该转换将强制该值为零或无穷大,从而失去其大小。这是一个例外的一般规则,即扩大算术转换保持整体规模。

如果在strictfp模式下进行相同的计算,则不允许浮点的指数超出浮点指数范围。无论生成什么计算,它都会将值强制为零或无穷大。每个浮点值都可以用double表示,因此转换根本不会更改该值,更不用说丢失总体大小了。

 类似资料:
  • 问题内容: 以下代码存在问题: 是,是。在不丢失信息的情况下,在这两种数字类型之间进行转换以使用编码器和解码器的唯一方法是吗? 注意,在您的典型情况下,我不尝试直接进行数值转换。我更关心维护随机数生成器的统计属性。 问题答案: 看到-1与以32位运行的进程一致。 例如,请参阅Go1.1发行说明(已引入) 使用可以帮助您查看发生了什么 事实证明,OP实战程序([在注释中]确认它最初以32位运行(因此

  • 我编写了一个非常简单的Flink流媒体作业,它使用从Kafka获取数据。 这工作得很好,每当我在Kafka上将某些内容放入主题时,它都会被我的Flink作业接收并处理。现在我试图看看如果我的Flink作业由于某种原因不在线会发生什么。所以我关闭了flink作业并继续向Kafka发送消息。然后我再次开始我的Flink作业,并期望它会处理同时发送的消息。 然而,我得到了以下信息: 因此,它基本上忽略了

  • 我有一个. csv文件编码在UCS-2LE BOM。我需要对它进行一些更改,我想使用preg_replace,所以我想将文件转换为UTF-8。然而,当我转换它时,所有的空格都消失了,所有属于同一行的单词都粘在一起。 我的代码是: 进行转换的正确方法是什么,这样我就不会丢失任何空格或字符? 转换前-Excel中的屏幕截图: 转换文件后:

  • 我对一个不太通用的需求有一个通用的问题。 我必须将一个Excel文件转换成PDF格式,但必须保留Excel文件中每个单元格的所有格式。不允许更改。比如,如果一个单元格被格式化为Currence/Accounting,那么默认情况下负值会显示在圆括号中,例如(8.5),但从Java读取时,该值是-8.5。对于数字单元格,值为0,但显示为连字符(-)。类似地,对于其他格式类型,显示也会发生变化。 如有

  • 我正在编写一个系统,它可以为不同的人修改一个模板字母(通过OpenXml Wordprocessing),然后将它们转换成pdfs进行打印。然而,在转换为pdf时,地址丢失了它从正常地址线的间隔切换 mrs1 Test2命名2 ,其 位于 向下 INR32M localDocText是完整文档的副本 我需要它将地址输出为正常格式,我不确定是什么导致了这一点

  • 问题内容: 缩小转换是指将可以容纳较大值的数据类型放入可以容纳较小值的数据类型。 但是,我不明白为什么将short转换为char会缩小转换范围,但是我有直觉,这与这两种数据类型的有符号/无符号有关,但我无法解释原因。 看起来这将是一个扩大的转换,或者至少不会缩小或扩大,因为它们都是16位并且可以容纳相同数量的值。 问题答案: 这是因为a 可以保持负值,而您可能从中看不到。让我举几个例子。 A(负)