【问题标题】:behavior of float-point conversion to integer浮点数转换为整数的行为
【发布时间】:2013-03-25 06:20:26
【问题描述】:

我有一个固定长度的整数类,我知道如何实现从我的类型到本机浮点数的转换,反之亦然,但有些特殊情况我不知道该怎么做:

假设有符号类型名称为T,无符号版本为UT,类型大小为128-bit

(1) 本机浮点值大于/小于TUT 可以表示的值?

(2) TUT 的值大于/小于本机浮点数可以表示的值?

我应该截断、抛出异常还是将结果设置为零?

谢谢。

【问题讨论】:

  • 我不认为这是一个编程问题!这取决于您的域。如果软件可以通过丢失精度来继续运行,那么您可以截断,否则会引发错误。
  • 我认为最好存储一些标志,并根据该标志的值截断或抛出异常。
  • @OzairKafray:实际上这个类是我创建的开源固定长度算术类型库的一部分,它可以在任何地方使用,这就是我问这个问题的原因
  • 您可能会觉得这很有趣:Comparing an Integer with a Float。不一定直接针对您正在做的事情,而是相关的。
  • 您看过 strtodstrtof 函数吗?在出现此类错误时,它们会给出明确的返回值。您的操作员应该模仿这些操作。

标签: c++ floating-point type-conversion


【解决方案1】:

根据您的问题,我不确定您是否完全理解浮点数。浮点表示既有量级又有精度,但你的问题只是在谈论量级。因此,尽管您的整数可能在浮点可表示的范围内,但它仍然可能无法准确地表示为浮点。你关心准确性的损失吗?

我的选择是抛出一个异常,但也包括预先检查一个数字是否可以用另一种格式表示的方法。换句话说,让您的代码的用户可以选择他们希望如何处理特殊情况。

【讨论】:

    【解决方案2】:

    最好的方法是构造最大和最小值相互兼容的整数-浮点对类

    【讨论】:

    • 假设你有一个 128 位有符号整数,它的最大值是 (+-)2^127。如果您构建最大值与整数相同的浮点数(以使用更多位数为代价),您将不会遇到异常。对于 128 位无符号整数部分,您可能需要更大的浮点值,您可以构造另一个 BigFloat 类
    • 当我说浮点数时,我指的是本机浮点数,它已经在语言中。还是谢谢。
    • 如果您计划在自己的大整数类和标准浮点类之间进行转换,您可能会遇到数据丢失。
    【解决方案3】:

    浮点值大于/小于 T 或 UT 可以表示的值?

    可能。语言标准要求浮点类型支持的值至少为 1037,或者等价于 2122,接近最大 128 位整数值 (签名或未签名)。

    T 或 UT 的值大于/小于浮点可以表示的值?

    可能会。

    IEEE-754单精度浮点格式的最大有限值略小于2128,而IEEE-754双精度格式的最大有限值略小于21024.

    这些答案最终取决于您的平台。

    我应该截断、抛出异常还是将结果设置为零?

    这取决于你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多