如何在fortran中控制rand函数中的小数位数?

时间:2015-05-09 19:39:15

标签: floating-point fortran precision

在下面的代码中,我想生成一个小数点后有两位数的随机数。例如,我想要一个随机变量给出(0.26)而不是(0.26463)。

这是我的代码:

PROGRAM alaki
IMPLICIT NONE
REAL :: RANDOMREAL
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(RANDOMREAL)
PRINT *, "random number= ", RANDOMREAL

END PROGRAM alaki

2 个答案:

答案 0 :(得分:0)

在Fortran中没有任何浮点数带有两个小数位。如果您需要更改从某个函数获得的值,则必须自己对其进行舍入。您可能想要创建一个包装原始函数的函数。

四舍五入可能如下:

rounded = real(nint(randomreal * 100)) / 100

答案 1 :(得分:0)

这是你的意思吗?

program alaki
    implicit none
    real :: randomreal, roundedrandomreal
    integer :: i
    character(*), parameter :: fmt = "(a,i2,a,g0,a,g0)"

    call random_seed()
    do i = 1, 10
        call random_number(randomreal)
        roundedrandomreal = nint(randomreal * 100) / 100.0
        write(*, fmt) "[", i, "]: ", randomreal, " -> ", roundedrandomreal
    end do
end

这是最新gfortran的可能输出:

[ 1]: 0.228682280 -> 0.230000004
[ 2]: 0.765717089 -> 0.769999981
[ 3]: 0.183222830 -> 0.180000007
[ 4]: 0.144763827 -> 0.140000001
[ 5]: 0.710479259 -> 0.709999979
[ 6]: 0.108196735 -> 0.109999999
[ 7]: 0.802814901 -> 0.800000012
[ 8]: 0.873218477 -> 0.870000005
[ 9]: 0.833641887 -> 0.829999983
[10]: 0.522882819 -> 0.519999981

您可以注意到,即使进行了这些计算,您也不会获得正确的数字,该数字在右侧用全零表示,只是因为十进制数字的机器表示始终是一个近似值(这就是为什么我不了解您后续计算的逻辑,却无法理解您要执行的操作)。如果要提高精度,可以更改实型的种类参数。