1

我正在构建一个系统来从异构文档中读取表格,并且想知道管理浮点数(列)的最佳方法。该列可以表示为我将使用的实数List<Double>(我使用的是 Java,但其他语言的经验会很有用。)我还希望将表序列化为 CSV 文件。因此,表格可能如下所示:

"material", "mass (g)", "volume (cm3)",
"iron", 7.8, 1.0,
"aluminium", 27.3, 9.9,

和 column2(基于 1)将由List<Double>

{new Double(7.8), new Double(27.3)} 

我也可能希望计算密度(质量/体积)并导出一个新列(“密度(g.cml-3)”)作为列表

{new Double(7.8), new Double(2.76)} 

然而,输入值有时会丢失、不寻常或由模糊概念表示。某些转换可能会引发异常(我将捕获并替换为上述之一)。示例包括:

1.0E+10000
>10
10 / 0.0 (i.e. divide by zero)
Math.sqrt(-1.)
Math.tan(Math.PI/2.0)

对于列表元素的异常值,我在 Java中有以下选项

  1. 空引用
  2. Double.NaN
  3. Double.MAX_VALUE
  4. Double.POSITIVE_INFINITY

是否有关于何时应使用上述 Java 异常值的协议?我已经阅读了有关他们行为方式的问题。(我想依靠链接他们的操作)。如果有协议,这些值可以序列化并读回吗?(例如,Java 是否解析"0x7ff0000000000000L"为等于Double.POSITIVE_INFINITY

我已经为规范中的一些精度损失做好了准备(OCR 中经常出现错误、缺少数字等,所以这是一个“足够好”的练习)。

4

1 回答 1

1

你有三个问题,你应该在某种程度上分开:

  1. 您应该对表格条目使用什么表示形式,可能是数字、某些单位的编号数量或其他内容?

  2. 浮点无穷大和 NaN 如何为您服务?

  3. 浮点对象如何序列化(写入文件并从文件中读取)?

关于这些:

  1. 您没有在此处指定足够的信息以获得有关如何表示表条目的良好建议。根据您的描述,根本没有理由使用浮点数。这是因为除了读取和写入条目之外,您还没有指定要对条目执行的操作。如果您不需要进行算术运算,则没有理由将值转换为浮点数或任何其他数字算术系统。您可以简单地将条目保留为其原始文本。这使得序列化变得微不足道。

  2. 浮点无穷大在设计上就像数学无穷大。无穷大加上除无穷大以外的数字仍然是无穷大,等等。您应该使用浮点无穷大来表示数学无穷大。您应该避免使用浮点无穷大来表示溢出,除非您不关心丢失溢出的值。浮点 NaN 旨在表示“不是数字”。它通常用于表示“发生错误,因此我们这里没有数字可以给您。你应该在这个地方做点别的事情。” 然后由应用程序提供其他内容,可能是通过从另一个来源或并行数据结构中获取补充信息。错误包括诸如取负数的平方根或未能初始化某些数据之类的事情。(例如,

  3. 写入和读取浮点值时,应注意准确转换值或确保您在转换中引入的错误是可以容忍的。如果您必须转换为文本(人类可读的数字)而不是写入“二进制”(具有任意值的字节),那么最好使用与浮点数的原生基数兼容的数字基数的表示法写入点系统(例如,用于二进制浮点表示的十六进制浮点数字,例如 0x3.4p-2 用于 .8125)。如果这不可行,那么您需要产生足够多的数字(转换为十进制时)以足够准确地表示浮点值,以便在读取时恢复原始值,并且您需要确保转换软件在不引入额外错误的情况下进行转换. 您还必须处理特殊值,例如无穷大和 NaN。

(请注意,Math.tan(Math.PI/2)它不是无穷大并且不会导致异常,因为Math.PI/2它不完全是 π/2,所以它的正切是有限的,而不是无穷大。)

于 2013-02-26T16:17:46.650 回答