?

Log in

No account? Create an account

Плавающая точка такая плавающая - Ваши рубидии уже у кобальта во ртути

Jan. 11th, 2019

09:22 am - Плавающая точка такая плавающая

Previous Entry Share Next Entry

Изобретение стандартного формата компьютерного представления чисел с плавающей точкой (IEEE-754) и спецификация операций с ними - величайшее счастье для всех прикладных математиков мира.

В доисторические времена могло быть так:

  001               PROGRAM MAIN
  002               I = 0
  003               B = -1.0E-10
  004               C = I+B
  005               PRINT 20,B,C
  006            20 FORMAT(1X2E20.12)
  007               END
           *EXECUTE
   -1.000000000000-10  -1.000444171950-10

И это не ошибка, а прямое следствие из механизма работы арифметического устройства. Попробуйте объяснить явление.

This entry was originally posted at https://spamsink.dreamwidth.org/1105540.html. Please comment there using OpenID.

Comments:

From:pigdeon
Date:January 11th, 2019 06:42 pm (UTC)
(Link)
Результат денормализации и обратной нормализации при сложении, если считать, что компилятор не налажал с конверсией целой переменной I. Ноль, скорее всего, был представлен как 0.0е+0
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 11th, 2019 07:42 pm (UTC)
(Link)
Конечно; а если брать ещё меньшие значения, то ошибка может быть и на порядки. Причем "тупой" (неоптимизирующий) компилятор перед сложением честно нормализует все целые значения, участвующие в операциях с плавающей точкой, и результат оказывается правильный, а "оптимизирующие" - лажают.
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:January 11th, 2019 07:05 pm (UTC)
(Link)
~> cat 11.f
      PROGRAM MAIN
      I = 0
      B = -1.0E-10
      C = I+B
      PRINT 20,B,C
   20 FORMAT(1X2E20.12)
      END
~> gfortran 11.f
~> ./a.out
  -0.100000001335E-09 -0.100000001335E-09

Just saying…
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 11th, 2019 07:44 pm (UTC)
(Link)
Я и говорю, IEEE rules.
На машине, в которой у нуля может быть только один порядок, иного трудно ожидать.
(Reply) (Parent) (Thread)
[User Picture]
From:dvv
Date:January 11th, 2019 09:35 pm (UTC)
(Link)
Долго не мог придумать, как бы использовать новый тип EC2 у AWS (евпочя) — с армовым процессором. Придумал. Зарядил там этот фортран — и те же цифры получил. I concur по поводу IEEE.
(Reply) (Parent) (Thread)
[User Picture]
From:febb
Date:January 11th, 2019 07:58 pm (UTC)
(Link)
Half-precision floating-point format.
https://en.wikipedia.org/wiki/Half-precision_floating-point_format

Ошибка представления числа.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 11th, 2019 09:18 pm (UTC)
(Link)
Какая именно ошибка, какого именно представления?
(Reply) (Parent) (Thread)
[User Picture]
From:alexanderr
Date:January 11th, 2019 08:13 pm (UTC)
(Link)
Intel кстати очень долго не мог толком отладить floating point operations в своих процессорах. сделать правильный FPU это очень и очень нетривиальная задача
(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 11th, 2019 09:16 pm (UTC)
(Link)
Безусловно, нетривиальная; а какие были известные проблемы в интеловских FPU, если не брать вычисление трансцендентных функций?
(Reply) (Parent) (Thread)
[User Picture]
From:ilya_dogolazky
Date:January 11th, 2019 11:05 pm (UTC)
(Link)
лет двадцать пять назад был такой раннинг гэг -- во всех газетах смеялись: открываешь виндоузный калькулятор, набираешь что-то типа дважды два и получаешь не совсем четыре. И вроде оно так делало только на интеловских процессорах, но не на амд-шных. Наверное подробности можно нагуглить, я мутно помню.
(Reply) (Parent) (Thread)
[User Picture]
From:alexanderr
Date:January 12th, 2019 12:27 am (UTC)
(Link)
https://en.wikipedia.org/wiki/Pentium_FDIV_bug

это же была очень громкая история в свое время и большой скандал

Intel знал про эту ошибку, но продолжал упорно торговать этими некачестенными процессорами, хотя это могло привести к печальным последствиям в некоторых случаях. они наивно надеялись, что никто ничего не заметит. мол, для такого открытия нужен очень умный человек с большими запасами свободного времени. хаха. таких якобы нет. а таких как раз в любом университете вагон и маленькая тележка
(Reply) (Parent) (Thread)
[User Picture]
From:alextr98
Date:January 11th, 2019 09:08 pm (UTC)

В доисторические времена

(Link)
Я вот и сейчас работаю с программой, где есть +0, -0 и просто 0.
И они все не равны друг другу.
Справедливости ради скажу, что все числа представлены как тексты.
И вся арифметика написана самостоятельно, и не так давно - лет десять назад.

(Reply) (Thread)
[User Picture]
From:spamsink
Date:January 11th, 2019 09:17 pm (UTC)

Re: В доисторические времена

(Link)
Народ знает толк в извращениях!
(Reply) (Parent) (Thread)
[User Picture]
From:alextr98
Date:January 11th, 2019 09:31 pm (UTC)

Re: В доисторические времена

(Link)
Да, про тип decimal и слыхом не слыхивали.
Кстати, в достаточно новом Go тоже нет decimal почему-то.
Видимо, не любят деньги считать.

(Reply) (Parent) (Thread)
[User Picture]
From:cegefbod
Date:January 11th, 2019 11:01 pm (UTC)
(Link)
Вспоминается приличный на начало 80х агрегат HP-1000 с микрокодированными инструкциями, например SQRT; ну а микрокод - это программа, а поскольку в программах бывают ошибки, то и SQRT(4.0) выдавал 1.0, но только в single precision. Народ всегда использовал double, обнаружено было при попытке оптимизации. В чем ошибка была — не знаю, но интересно почему.
(Reply) (Thread)