Вопрос

Согласно справке 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 таким же образом рассматривает значение как одиночный тип данных.

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

const MAX_DOUBLE as Double = 1.79769313486232D+308

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

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

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

Это было полезно?

Решение

Обязательно ли это должна быть Константа?Вы можете получить точное значение 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

Другие советы

Редактировать:Решил это!

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

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

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

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

Const MAX_DOUBLE As Double = 1.79769313486231E+308

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

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

Public Const MAX_DOUBLE = 1.79769313486232E+308

[редактировать]

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

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22555684.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top