Ось ключ до вашої проблеми: 10
це продукт 2
і 5
. Ви можете уявити будь-яку кількість разів в базі 10 десяткових знаків , що становить до * 1/2 п * 1/5 м , де k
, n
і m
цілі числа.
Альтернативно - фразове значення - якщо число n
в 1 / n містить коефіцієнт, який не входить до числа факторів бази, число не може бути представлене точно у фіксованій кількості цифр у двійковій / десятковій / незалежно від розширення цього номер - він буде мати повторювану частину. Наприклад 1/15 = 0,0666666666 .... тому що 3 (15 = 3 * 5) не є коефіцієнтом 10.
Таким чином, все, що може бути представлене в основі 2 точно (k * 1/2 n ), може бути представлене в базі 10 точно.
Крім того, існує питання про те, скільки цифр / бітів ви використовуєте для представлення числа. Існує кілька цифр, які можуть бути точно представлені в якійсь базі, але для цього потрібно більше, ніж деяка кількість цифр / біт.
У двійковій формі число 1/10, яке зручно 0,1 в десятковій частині, не може бути представлене як число, яке може бути представлене фіксованою кількістю бітів у двійковій формі. Натомість число 0,00011001100110011 ... 2 (частина 0011 повторюється назавжди).
Давайте подивимося на число 1 2 /1010 2 трохи ближче.
____
0,00011
+ ---------
1010 | 1.00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1 000 |
0 |
------ | повторення
1 0000 | блок
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
Це точно той самий тип речі, який ви отримуєте, коли намагаєтесь зробити довгий поділ на 1/3.
1/10, коли фактичний коефіцієнт дорівнює 1 / (2 1 * 5 1 ). Для бази 10 (або будь-якого кратного 10) це число закінчується і називається регулярним числом . Десяткове розширення, яке повторюється, відоме як десяткове число, що повторюється , і ті числа, які тривають вічно без повторення, є нераціональними числами.
Математика за цим поглиблюється в малі теореми Ферма ... і як тільки ви починаєте говорити Ферма чи теорема, це стає Math.SE питання .
Чи є номери, які не можуть бути представлені в базі 10, але можуть бути представлені у базі 2?
Відповідь - «ні».
Отже, на цьому етапі всім нам повинно бути зрозуміло, що кожне бінарне розширення з фіксованою довжиною раціонального числа може бути представлене як десяткове розширення з фіксованою довжиною.
Давайте більш уважно подивимось на десятковий знак у C #, який веде нас до десяткової плаваючої точки в .NET і дано автору, я прийму це так, як це працює.
Десятковий тип має ті ж компоненти, що і будь-який інший номер з плаваючою комою: мантіса, експонент та знак. Як завжди, знак - це лише один біт, але є 96 біт мантіси і 5 біт експонента. Однак не всі комбінації експонентів є дійсними. Працюють лише значення 0-28, і вони фактично всі негативні: числове значення є . Це означає, що максимальні та мінімальні значення типу становлять +/- (2 96 -1), а найменше ненульове число за абсолютною величиною - 10 -28 .sign * mantissa / 10exponent
Я одразу зазначу, що через цю реалізацію є номери у double
типі, які неможливо представити, decimal
- ті, що виходять за межі діапазону. Double.Epsilon
це те, 4.94065645841247e-324
що не може бути представлене в decimal
, а може в а double
.
Однак в межах діапазону, який може представляти десятковий, він має більше бітів точності, ніж інші натурні типи, і може представляти їх без помилок.
Навколо плавають деякі інші типи. У C # є BigInteger, який може представляти довільно велике ціле число. Там немає ніякого еквівалента в Java BigDecimal (який може представляти числа з десятковими цифрами до 2 32 цифр довгих - що є значним діапазон) точно . Однак, якщо ви трохи розім’єтеся, ви можете знайти реалізовані вручну реалізації.
Є деякі мови, які також мають раціональний тип даних, який дозволяє точно представляти раціональні дані (так що 1/3 - це фактично 1/3).
Спеціально для C # та вибору float або раціонального, я відкладу до Jon Skeet від плаваючої пінти Decimal у .NET :
Більшість бізнес-додатків, ймовірно, повинні використовувати десятковий, а не плаваючий чи подвійний. Моє правило полягає в тому, що техногенні значення, такі як валюта, як правило, краще представлені десятковою плаваючою комою: наприклад, рівно 1,25 долара цілком розумно. Для значень природного світу, таких як довжини та ваги, бінарні типи з плаваючою комою мають більше сенсу. Незважаючи на те, що існує теоретичне «рівно 1,25 метра», це ніколи не відбудеться в реальності: ви, звичайно, ніколи не зможете виміряти точну довжину, і вони навряд чи існуватимуть на атомному рівні. Ми звикли, що там задіяна певна толерантність.