Как мне объявить MAX_DOUBLE в VB6? - PullRequest
4 голосов
/ 30 мая 2009

Согласно справке MSDN для VB6

Значения с плавающей точкой могут быть выражены как mmmEeee или mmmDeee, где mmm - это мантисса, а eee - показатель степени (степень 10). Наибольшее положительное значение типа данных Single составляет 3.402823E + 38 или в 3,4 раза от 10 до 38-й степени; самое высокое положительное значение типа данных Double равно 1.79769313486232D + 308, или примерно в 1,8 раза от 10 до 308-й степени. Использование D для разделения мантиссы и экспоненты в числовом литерале приводит к тому, что значение обрабатывается как тип данных Double. Аналогично, использование E таким же образом рассматривает значение как тип данных Single.

Теперь в VB6 IDE я пытался ввести это

const MAX_DOUBLE as Double = 1.79769313486232D+308

однако, как только я отойду от этой строки, среда IDE выдаст ошибку 6 (переполнение)

Переполнение возникает при попытке выполнить назначение, превышающее ограничения цели назначения. ...

Так, как мне определить MAX_DOUBLE (и MIN_DOUBLE в этом отношении)?

Ответы [ 4 ]

4 голосов
/ 30 мая 2009

Должно ли это быть Const? Вы можете получить точное значение MAX_DOUBLE в переменную, установив правильный битовый шаблон, используя CopyMemory из байтового массива.

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Dim Max As Double
Dim Idx As Long
Dim Bits(0 To 7) As Byte

For Idx = 0 To 5
   Bits(Idx) = 255
Next
Bits(6) = 239 ' = 11101111
Bits(7) = 127

For Idx = 0 To 7
   CopyMemory ByVal VarPtr(Max) + Idx, Bits(Idx), 1
Next

Debug.Print Max

Редактировать: Я забыл, что вы также спрашивали о MIN_DOUBLE, что еще проще.

Dim Min As Double
Dim Bits As Byte

Bits = 1
CopyMemory ByVal VarPtr(Min), Bits, 1

Debug.Print Min
3 голосов
/ 01 июня 2009

Изменить: Решено!

Const test As Double = 1.79769313486231E+308 + 5.88768018655736E+293

Дважды проверил его до двоичного уровня, который должен быть как можно выше. Вы можете продолжать добавлять значения, такие как 1 и т. Д., Но это дает число, равное, не больше чем Вывод такой: 01111111 | 11101111 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111 | 11111111 Что действительно является DoubleMax

Старый: Вы можете просто использовать Положительная бесконечность .

0 голосов
/ 30 мая 2009

Очевидный прагматичный обходной путь: немного уменьшите число.

Const MAX_DOUBLE As Double = 1.79769313486231E+308

Я полагаю, что в большинстве ситуаций этого будет достаточно.

0 голосов
/ 30 мая 2009

Используйте «E» для показателя степени в номере вместо «D», как показано ниже.

Public Const MAX_DOUBLE = 1.79769313486232E+308

[править]

Взгляните на эту ссылку ниже, прокрутите вниз. Этот конкретный пример кода показывает, как эта конструкция используется. Надеюсь, это поможет.

http://www.experts -exchange.com / Программирование / Языки / .NET / Visual_Basic.NET / Q_22555684.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...