Одне, що я хотів би бачити, - це визнання того, що double
його float
слід розглядати як розширення конверсії, тоді як float
до double
звуження (*). Це може здатися протиінтуїтивно зрозумілим, але врахуйте, що типи означають насправді:
- 0,1f означає "13,421,773,5 / 134,217,728, плюс-мінус 1 / 268,435,456 або близько того".
- 0,1 дійсно означає 3,602,879,701,896,397 / 36,028,797,018,963,968 плюс або мінус 1 / 72,057,594,037,927,936 або так "
Якщо один має a, double
який найкраще відображає кількість "десята частина" і перетворює його float
в результат, то це буде "13,421,773,5 / 134,217,728 плюс або мінус 1 / 268,435,456 або так", що є правильним описом значення.
На противагу цьому, якщо у людини є a, float
яка найкраще відображає кількість "десята частина" і перетворює її в double
, результат буде "13,421,773,5 / 134,217,728, плюс або мінус 1 / 72,057,594,037,927,936 або так" - рівень мається на увазі точності що неправильно в коефіцієнті понад 53 мільйони.
Хоча стандарт IEEE-744 вимагає, щоб математика з плаваючою комою виконувалася так, як ніби кожне число з плаваючою комою представляє точну числову величину саме в центрі його діапазону, що не слід вважати, що значення з плаваючою комою насправді представляють саме такі точні числові величини. Швидше, вимога про те, щоб значення вважалися в центрі їх діапазонів, випливає з трьох фактів: (1) обчислення повинні виконуватися так, ніби операнди мають якісь конкретні точні значення; (2) послідовні та задокументовані припущення є кориснішими, ніж суперечливі або недокументовані; (3) якщо можна зробити послідовне припущення, жодне інше послідовне припущення не може бути кращим, ніж припущення, що величина являє собою центр його діапазону.
Між іншим, я пам’ятаю, якихось 25 років або близько тому хтось придумав пакет із числовими номерами для C, який використовував «типи діапазону», кожен з яких складався з пари 128-бітних плавців; всі обчислення будуть зроблені таким чином, щоб обчислити мінімальне та максимально можливе значення для кожного результату. Якщо хтось зробив великий тривалий ітеративний розрахунок і придумав значення [12.53401391134 12.53902812673], можна бути впевненим, що хоча багато цифр точності втрачено на помилки округлення, результат все одно може бути розумно виражений як 12,54 (і це не було " t дійсно 12,9 або 53,2). Я здивований, що я не бачив жодної підтримки таких типів на будь-яких основних мовах, тим більше, що вони здадуться добре підходити до математичних одиниць, які можуть працювати паралельно на кількох значеннях.
(*) На практиці часто корисно використовувати значення подвійної точності для проведення проміжних обчислень під час роботи з одноточними числами, тому необхідність використання набору тексту для всіх таких операцій може бути прикрою. Мови могли б допомогти, маючи тип "нечіткий подвійний", який би виконував обчислення як подвійні, і їх можна було вільно передавати на одиничні та з них; це було б особливо корисно, якби функції, які приймають параметри типу double
та повернення, double
могли бути позначені таким чином, що вони автоматично генерують перевантаження, яка приймає та повертає "нечіткий подвійний" замість цього.