Распечатав значения x
во время цикла, вы можете получить некоторое представление о том, что происходит. Первые несколько значений
2.08333284E-02
5.20832092E-03
1.30205788E-03
3.25469766E-04
8.12780345E-05
2.01406947E-05
4.67754580E-06
4.54130713E-07
-1.31697880E-06
-3.19026776E-06
-6.51961273E-06
-1.30739954E-05
Обратите внимание, как меняется знак, и значение продолжает монотонно возрастать оттуда. Вы могли заметить, что для отрицательных значений x
определенная вами последовательность растет экспоненциально, поэтому, как только вы станете отрицательным, экспоненциальный рост быстро доставит вас и приведет к переполнению с плавающей запятой, так как x
просто растет и растет (после 100 итераций его уже за 1E+21
).
Однако давайте посмотрим, что произойдет, если мы увеличим точность с плавающей запятой, указав
Integer, Parameter :: wp = Selected_real_kind( 13, 70 )
real(kind=wp), dimension(255) :: x
Если мы сейчас скомпилируем и запустим ту же самую программу, мы заметим, что x(k)
становится равным 0 при увеличении k
, но не меняет знак в течение 255 итераций. Так что на самом деле переполнение, которое вы видите, вызвано недостаточной точностью представления с плавающей запятой, что приводит к ошибочной смене знака и последующему экспоненциальному росту.
person
Kai Guther
schedule
31.07.2018