首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fortran 95自己围起来

fortran 95自己围起来
EN

Stack Overflow用户
提问于 2013-09-21 19:57:45
回答 2查看 920关注 0票数 1

我决定学习fortran95语言(原因并不重要)。然而,作为一个初学者,我遇到了一个我真的无法解释的奇怪的问题,因此我需要帮助。

我有插入排序算法:

代码语言:javascript
复制
subroutine insertion_sort_REAL4(array, array_len)
   implicit none
!parameners
   integer :: array_len
   real (kind=4), dimension(array_len) :: array 
!variables
   integer :: i,key,hole_pos
   do i = 0,array_len
      key = array(i)
      hole_pos = i;
      do while ((hole_pos > 0.0) .and. (key < array(hole_pos - 1)))
         array(hole_pos) = array(hole_pos - 1)
         hole_pos = hole_pos - 1
      end do
      array(hole_pos) = key
   end do
   return
end   

还有主程序(节选):

代码语言:javascript
复制
real (kind = 4), dimension(3) :: x
x(1) = 3.1
x(2) = 4.3
x(3) = 5.4
write(*,*) 'Array = ',x
call insertion_sort_REAL4(x,3)
write(*,*) 'Array = ',x  

第一个write语句输出

代码语言:javascript
复制
Array =    3.09999990       4.30000019       5.40000010 

为何数字会有轻微的改变?默认情况下,fortran95不使用IEEE754标准吗?

但是假设我可以忍受这种微小的变化;第二个write语句打印出来

代码语言:javascript
复制
Array =    3.00000000       4.00000000       5.00000000  

为什么要把数字加起来呢?它真的困扰着我,格式化‘写’的声明没有任何好处,谷歌搜索也没有真正的帮助。我想互联网上并没有那么多关于fortran的东西,因为它是C的,我是一个很好的C程序员,所以任何类似的东西都是值得赞赏的。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-21 20:05:26

像"3.1“这样的十进制数很可能在有限长度的二进制数中没有精确的表示。源代码语句x(1) = 3.1使计算机将该十进制数字转换为二进制并存储它。语句write (*, *) x(1)使计算机获取此二进制值并将其转换为十进制。因为"3.1“不能精确地用有限长二进制表示,所以向十进制的转换不能精确地恢复"3.1”。这就解释了"3.09999990“的输出。这不是具体的Fortran,而是一般的有限精度浮点算法。

至于另一个问题,key在排序子例程中被声明为整数,因此是将重数舍入整数。当我在完全打开编译器警告的情况下编译您的程序时,gfortran通知了我。

如果您使用gfortran,请尝试以下编译器选项:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace。您还会发现您的程序有一个下标错误。

票数 3
EN

Stack Overflow用户

发布于 2013-09-21 20:07:58

对于第一部分:它确实使用IEEE754,这就是数字被“更改”的原因。

关于浮点算法,每个计算机科学家应该知道什么?的文章是理解这是如何工作的必读的,也有好的IEEE754计算器 .

所以3.1从来就不是3.1,但是

代码语言:javascript
复制
3.0999999046325684

首先。

至于第二部分():它们不是四舍五入,而是转换成整数,但我不是Fortran,所以我猜在insertion_sort_REAL4例程中,有些东西被声明为int,这会导致数字被转换为整数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18936972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档