fortran 95在它的基础上进行四舍五入';他自己的

fortran 95在它的基础上进行四舍五入';他自己的,fortran,gfortran,fortran95,Fortran,Gfortran,Fortran95,我决定学习fortran95语言(原因不重要)。 然而,作为一个初学者,我遇到了一个奇怪的问题,我真的无法解释,因此我需要帮助 我有插入排序算法: subroutine insertion_sort_REAL4(array, array_len) implicit none !parameners integer :: array_len real (kind=4), dimension(array_len) :: array !variables integer ::

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

我有插入排序算法:

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   
第一个
write
语句打印出来

Array =    3.09999990       4.30000019       5.40000010 
为什么数字略有变化?fortran95是否默认不使用IEEE754标准

但我们可以说,我可以接受轻微的改变;第二个
write
语句打印出来

Array =    3.00000000       4.00000000       5.00000000  
为什么这些数字被四舍五入? 这真的让我头疼,格式化“write”语句没有任何好处,谷歌搜索也没有真正的帮助。我想互联网上关于fortran的东西并没有C语言那么多。我是一个正派的C语言程序员,所以任何与之类似的东西都值得欣赏。 谢谢你的帮助

像“3.1”这样的十进制数在有限长度的二进制数中可能没有精确的表示形式。源代码语句
x(1)=3.1
使计算机将十进制数转换为二进制并存储。语句
write(*,*)x(1)
使计算机获取此二进制值并将其转换为十进制。因为“3.1”不能用有限长度的二进制精确表示,所以转换为十进制不能精确地恢复“3.1”。这解释了“3.099990”的输出。这不是Fortran特有的,而是有限精度浮点运算的通用

至于另一个问题,
在排序子例程中被声明为整数,因此将实数舍入为整数。当我编译你的程序时打开了完整的编译器警告,gfortran通知我这一点

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

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

至于另一个问题,
在排序子例程中被声明为整数,因此将实数舍入为整数。当我编译你的程序时打开了完整的编译器警告,gfortran通知我这一点


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

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

这篇文章是一个必须阅读,以了解这是如何工作的,也有好的

所以3.1从来就不是确切的3.1,而是

3.0999999046325684
首先


至于第二部分:它们不是四舍五入而是转换成整数,但我不是Fortran语言,所以我猜在
插入排序\u REAL4
例程中有一些东西被声明为int,这会导致数字转换成整数。

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

这篇文章是一个必须阅读,以了解这是如何工作的,也有好的

所以3.1从来就不是确切的3.1,而是

3.0999999046325684
首先


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

又是一天中的那个时候了。强制性链接:在这种情况下,他没有做任何浮点运算。这些值将被精确地保留(如果不是因为意外的类型转换),现在又是一天中的那个时候了。强制性链接:在这种情况下,他没有做任何浮点运算。这些值将被精确地保留(如果不是为了意外的类型转换的话。)啊,是的!非常感谢。整数变量“key”是问题所在->我猜编译器在没有通知的情况下进行隐式转换。顺便问一下:什么是下标错误?程序编译并正常工作…下标错误是指程序引用不存在的数组元素。例如,对于
数组(1:3)
,引用
数组(0)
将是一个错误。如果你研究你的计划,你会发现这样一个问题。或者使用该选项对编译器进行运行时下标检查——与其他编译语言相比,使用该选项是Fortran的优势之一。啊,是的!非常感谢。整数变量“key”是问题所在->我猜编译器在没有通知的情况下进行隐式转换。顺便问一下:什么是下标错误?程序编译并正常工作…下标错误是指程序引用不存在的数组元素。例如,对于
数组(1:3)
,引用
数组(0)
将是一个错误。如果你研究你的计划,你会发现这样一个问题。或者使用该选项检查编译器的运行时下标-