【问题标题】:How to set Integer and Fractional Precision independently?如何独立设置整数和小数精度?
【发布时间】:2017-09-25 05:00:33
【问题描述】:

我正在学习 Fortran(使用 Fortran 2008 标准)并且想为 real 变量独立设置我的整数部分精度和小数部分精度。我该怎么做呢?

例如,假设我想声明一个 real 变量,其整数部分精度为 3,小数部分精度为 8。

上述规范中的一个示例编号是 123.12345678,但 1234.1234567 不满足给定要求。

【问题讨论】:

  • 对于实数,Fortran 仅根据浮点数进行定义。在这样的模型中,我不清楚整数和小数部分具有独立精度是什么意思。你能用一个例子澄清一下吗? [当然,你可以以某些方式使用非内在的东西。]
  • 你是指小数部分和指数部分(而不是整数部分)?
  • @francescalus ,我在描述中包含了一个示例
  • @SteveES 我已经添加了一个示例,请立即查看说明。
  • 你为什么要这样格式化你的数字?你想对他们做什么?这是用于计算还是用于输出?

标签: fortran fortran2008


【解决方案1】:

Fortran 实数是浮点数。浮点数不存储整数部分和小数部分。它们存储有效数和指数。

了解浮点数的工作原理http://en.wikipedia.org/wiki/Floating-point_arithmetic CPU 通常使用一种浮点格式,而您不能简单地选择其他格式。

您要求的更像是 FIXED 点算术,但现代 CPU 和 Fortran 本身并不支持它。 https://en.wikipedia.org/wiki/Fixed-point_arithmetic

您可以在各种库(甚至可能是 Fortran)或语言中使用它们,但它们不是原生的 REAL。它们可能是在软件中实现的,而不是直接在 CPU 中实现的,而且速度较慢。

【讨论】:

  • 感谢您的回答,我有一个跟进:所以现在我使用 selected_real_kind(16) 的返回值来使用 kind 参数指定精度,但是当我打印出计算结果时,它似乎使用定点算法。例如:因为我设置了 selected_real_kind(16),所以 3.14 ** 3.14 给出 36.3378388801746960712 而 10.12 ** 10.12 给出 14873966072.8729692074 我将实变量“ar”设置为 3.14 和 10.12
  • 这是个误会。请注意,10.12 是单精度(默认)实常数,除非您使用特定类型声明它。见stackoverflow.com/questions/6146005/…
  • 不,这不是真的!!! 请务必仔细阅读stackoverflow.com/questions/6146005/…ar 拥有什么样的类型并不重要。 10.12 是单精度!另请阅读stackoverflow.com/questions/42618704/…,这更简单。
  • @anuvaramban 这正是您在 浮点 算术中所期望的,它保持相同数量的有效数字(二进制​​)。定点算术会丢失显着的数字精度(肯定是小数字),但保留小数点精度。
  • @anuvaramban 另外,请记住,输出上的数字格式与其表示内部相同
【解决方案2】:

我最终为此编写了一个函数,以便在不实际修改浮点数的情况下通过 .gt./.lt./.ge./.le./.eq. 运算符使用浮点数。

function PreciseInt(arg1, arg2) Result(PreciseInt)
  real*8     arg1       !Input variable to be converted
  integer*4  arg2       !Input # for desired precision to the right of the decimal
  integer*4  PreciseInt !Integer representing the real value with desired precision

  PreciseInt = idnint(arg1 * real(10**arg2))
end function

【讨论】:

  • 请考虑使用{} 按钮来正确格式化您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多