Sub testCDec() Dim my_dec1 'As Variant 'только не Double, а отдельного типа Decimal, увы, нету Dim my_dec2 'As Variant my_dec1 = CDec("12,345671234567123456712345678") '29 значащих цифр максимум my_dec2 = CDec("10,000000000000000000000000001") Debug.Print my_dec1 + my_dec2 '= 22,345671234567123456712345679 End Sub
Sub testCDec() Dim my_dec1 'As Variant 'только не Double, а отдельного типа Decimal, увы, нету Dim my_dec2 'As Variant my_dec1 = CDec("12,345671234567123456712345678") '29 значащих цифр максимум my_dec2 = CDec("10,000000000000000000000000001") Debug.Print my_dec1 + my_dec2 '= 22,345671234567123456712345679 End Sub
Потому что Double это 8 байт, а Single вообще 4. В вещественных числах один байт - это, грубо говоря, 2 десятичных разряда (две значащие цифры). Это только в целых числах байт содержит максимально число 255, а в вещественных - максимально 99. Т.е. один десятичный разряд это полбайта или 4 бита. Для цифр от 0 до 7 хватает и трёх бит, но надо же еще 8 и 9 приткнуть, поэтому и приходится 4-й бит привлекать. Ну, а дальше просто удобно - делить байт на две части по 4 бита, что и делают.
Соответственно, 8 байт x 2 цифры = 16 цифр. Плюс знак числа, плюс десятичная точка. Соответственно, по факту получается в зависимости от системной реализации число Double может содержать 15-17 цифр, о чем, кстати, говорит и Википедия. В VBA я, как раз, вижу 15 цифр.
Потому что Double это 8 байт, а Single вообще 4. В вещественных числах один байт - это, грубо говоря, 2 десятичных разряда (две значащие цифры). Это только в целых числах байт содержит максимально число 255, а в вещественных - максимально 99. Т.е. один десятичный разряд это полбайта или 4 бита. Для цифр от 0 до 7 хватает и трёх бит, но надо же еще 8 и 9 приткнуть, поэтому и приходится 4-й бит привлекать. Ну, а дальше просто удобно - делить байт на две части по 4 бита, что и делают.
Соответственно, 8 байт x 2 цифры = 16 цифр. Плюс знак числа, плюс десятичная точка. Соответственно, по факту получается в зависимости от системной реализации число Double может содержать 15-17 цифр, о чем, кстати, говорит и Википедия. В VBA я, как раз, вижу 15 цифр.Gustav
ТАМ они пишут о том, что (если читать между строк) мантисса типа Single содержит 7 значащих цифр, что логично, если мои рассуждения выше относительно Double c 15 цифрами в мантиссе теперь распространить на Single, который в памяти в два раза короче. Ну, а порядок (экспонента) типа E38 или E-45 как раз, наверное, и хранится "где-нибудь внутри" последней (восьмой) "цифры".
Не смешивайте абсолютные значения чисел - от микроскопических до бесконечно гигантских - с количеством "выразительных" (значащих) цифр от начала числа слева (до буквы E). Для Single Вы можете задать громадное число (7 знаков мантиссы): [vba]
Код
1.234567E+20
[/vba] , которое соответствует обычному арифметическому виду (21 цифра): [vba]
Код
123 456 700 000 000 000 000
[/vba] но не можете его "уточнить" еще парой знаков "89" (9 знаков мантиссы): [vba]
Код
1.23456789E+20
[/vba] , которое соответствует обычному арифметическому виду (21 цифра): [vba]
Код
123 456 789 000 000 000 000
[/vba] потому что оно будет (явно или неявно) округлено (до 7 знаков мантиссы): [vba]
Код
1.234568E+20
[/vba] или до арифметического вида (без 8 и 9) [vba]
Код
123 456 800 000 000 000 000
[/vba] т.е. заключительные 8 и 9 пропали из числа, хотя и округлили последнюю 7 мантиссы до 8.
Запустите для наглядности следующий код: [vba]
Код
Sub testSingle() Dim s As Single s = 1.23456789012345E+20 Debug.Print s '= 1,234568E+20 End Sub
ТАМ они пишут о том, что (если читать между строк) мантисса типа Single содержит 7 значащих цифр, что логично, если мои рассуждения выше относительно Double c 15 цифрами в мантиссе теперь распространить на Single, который в памяти в два раза короче. Ну, а порядок (экспонента) типа E38 или E-45 как раз, наверное, и хранится "где-нибудь внутри" последней (восьмой) "цифры".
Не смешивайте абсолютные значения чисел - от микроскопических до бесконечно гигантских - с количеством "выразительных" (значащих) цифр от начала числа слева (до буквы E). Для Single Вы можете задать громадное число (7 знаков мантиссы): [vba]
Код
1.234567E+20
[/vba] , которое соответствует обычному арифметическому виду (21 цифра): [vba]
Код
123 456 700 000 000 000 000
[/vba] но не можете его "уточнить" еще парой знаков "89" (9 знаков мантиссы): [vba]
Код
1.23456789E+20
[/vba] , которое соответствует обычному арифметическому виду (21 цифра): [vba]
Код
123 456 789 000 000 000 000
[/vba] потому что оно будет (явно или неявно) округлено (до 7 знаков мантиссы): [vba]
Код
1.234568E+20
[/vba] или до арифметического вида (без 8 и 9) [vba]
Код
123 456 800 000 000 000 000
[/vba] т.е. заключительные 8 и 9 пропали из числа, хотя и округлили последнюю 7 мантиссы до 8.
Запустите для наглядности следующий код: [vba]
Код
Sub testSingle() Dim s As Single s = 1.23456789012345E+20 Debug.Print s '= 1,234568E+20 End Sub