Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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
Java 表中不寻常的浮点数_Java_Floating Point - Fatal编程技术网

Java 表中不寻常的浮点数

Java 表中不寻常的浮点数,java,floating-point,Java,Floating Point,我正在构建一个从异构文档中读取表的系统,我想知道管理浮点数(列)的最佳方法。如果列可以表示为实数,我将使用List(我使用Java,但有其他语言的经验会很有用。)我还希望将表序列化为CSV文件。因此,表可能看起来像: "material", "mass (g)", "volume (cm3)", "iron", 7.8, 1.0, "aluminium", 27.3, 9.9, 第2列(基于1)将由列表表示 我还可能希望计算密度(质量/体积),并导出一个新列(“密度(g.cml-3)”)作为列

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

"material", "mass (g)", "volume (cm3)",
"iron", 7.8, 1.0,
"aluminium", 27.3, 9.9,
第2列(基于1)将由
列表表示

我还可能希望计算密度(质量/体积),并导出一个新列(“密度(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)
对于列表元素的异常值,我有以下内容

  • 空引用
  • Double.NaN
  • Double.MAX\u值
  • Double.正无穷大
  • 是否有协议规定何时应使用上述Java异常值?我对他们的行为有点怀疑。(我想依靠他们的运营链)。如果有协议,这些值可以序列化并读回吗?(例如,Java是否将
    “0x7FF0000000L”
    解析为一个等于
    双精度的数字。正无穷大


    我已准备好应对规格中的某些精度损失(OCR中经常出现错误、缺少数字等,因此这是一个“足够好”的练习)。

    您有三个问题需要在一定程度上加以区分:

  • 表项应该使用什么表示法,可能是数字、某些单位的编号数量或其他东西

  • 浮点无穷大和NaN如何为您服务

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

  • 关于这些:

  • 您在此处未指定足够的信息,无法提供有关如何表示表项的好建议。根据您的描述,根本没有理由使用浮点。这是因为您没有指定除了读写之外,还需要对这些项执行哪些操作。如果您不需要执行算术,则e不是麻烦将值转换为浮点或任何其他数字算术系统的理由。您可以简单地将条目作为原始文本进行维护。这使得序列化变得微不足道

  • 浮点无穷大的作用类似于数学无穷大。无穷大加上一个除无穷大以外的数字,仍然是无穷大,等等。你应该使用浮点无穷大来表示数学无穷大。你应该避免使用浮点无穷大来表示溢出,除非你不在乎丢失在溢出时。浮点NaN表示“不是一个数字”。它通常用于表示类似“发生错误,因此我们这里没有数字提供给您。您应该在此处执行其他操作。”然后由应用程序提供其他信息,可能是通过从另一个源或并行数据结构中获取补充信息。错误包括取负数的平方根或未能初始化某些数据等。(例如,一些底层软件将浮点数据初始化为NaN,因此,如果您自己不初始化它,NaN将保留。)您通常应将NaN视为“空白位置”,不能使用,而不能将其视为表示某物的标记

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


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

    您有三个问题需要在一定程度上分开:

  • 表项应该使用什么表示法,可能是数字、某些单位的编号数量或其他东西

  • 浮点无穷大和NaN如何为您服务

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

  • 关于这些:

  • 您在此处未指定足够的信息,无法提供有关如何表示表项的好建议。根据您的描述,根本没有理由使用浮点。这是因为您没有指定除了读写之外,还需要对这些项执行哪些操作。如果您不需要执行算术,则e不是麻烦将值转换为浮点或任何其他数字算术系统的理由。您可以简单地将条目作为原始文本进行维护。这使得序列化变得微不足道

  • 通过设计,浮点无穷大与数学无穷大类似。无穷大加上除无穷大之外的一个数字,仍然是无穷大,等等。你应该使用浮点无穷大来表示数学无穷大。你应该避免使用fl
    1.0E+10000
    >10
    10 / 0.0 (i.e. divide by zero)
    Math.sqrt(-1.)
    Math.tan(Math.PI/2.0)