Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Огромные числа... ПОМОГИТЕ!!! Добавлено: 13.04.04 09:57  

Автор вопроса:  Djoni

Народ, вопрос в следующем мне не хватает переменной Double, но вполне подходит long double, которой в VB нет. Что мне делать, писать dll на С(ни разу не писал dll), есть какие-то компоненты для VB и их применить, или тем кому это предназначается сказать, что "извините не получилось"J. Надо очень быстро написать эти расчеты.

 Использую метод наименьших квадратов, входные данные типа signed int(4 байта со знаком), выходные long double.

       Народ помогите разобраться или посоветуйте что-нибудь, где мне раздобыть такую переменную, может это кому еще понадобится, ведь некоторым необходимо точные вычисления.

   Буду благодарен всем ответившим!!!

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 13.04.04 10:28

Не хватает Double? Что же у тебя за вычисления, что 8 байт не хватает?

Еслу уж совсем напряг - используй Decimal - 12 байт.

Явно определить тебе её не удасться, но можешь задать переменную типа Variant, а затем применить к ней функцию CDec.

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 13.04.04 10:32

И так, кстати - Long Double в С++ идентичнен Double, т.е. те же 8 байт со знаком. Чем это тебя устраивает больше - решать тебе.

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 13.04.04 11:30

Длинная арифметика, пользовательский логарифмический тип данных типа

Private Type BigNum

Mantissa As Double

Exponenta As Double

End Type

Ответить

Номер ответа: 4
Автор ответа:
 Djoni



Вопросов: 6
Ответов: 35
 Профиль | | #4 Добавлено: 13.04.04 11:57

LamerOnLine, почему??? long double-10 байт; double-8 байт

Microsoft Visual C++ is consistent with the IEEE numeric standards. There are three internal varieties of real numbers. Real*4 and real*8 are used in Visual C++. Real*4 is declared using the word float. Real*8 is declared using the word double. In Windows 32-bit programming, the long double data type maps to double. There is, however, assembly language support for computations using the real*10 data type.

The values are stored as follows:

ValueStored as
real*4sign bit, 8-bit exponent, 23-bit mantissa
real*8sign bit, 11-bit exponent, 52-bit mantissa
real*10sign bit, 15-bit exponent, 64-bit mantissa

вот мне как раз последний и устраивает

Я пишу на VB6, там только есть только Variant, и определен он криво мне не подходит, а с Demical я пока не разобрался, если поможешь примером буду признателен

 

 

 

Ответить

Номер ответа: 5
Автор ответа:
 Djoni



Вопросов: 6
Ответов: 35
 Профиль | | #5 Добавлено: 13.04.04 12:13
Sharp , ты извини, но я не совсем понимаю, а как с этим типом работать??? И как сделать преобразование ведь входные данные не разделены на мантису и экспоненту. Может это и есть, что мне надо, но как производить вычисление и т.д. не понятно

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 13.04.04 12:13

Djoni, да не почему. Если ты пишешь под Win16, тогда Long Double рулит. В других случаях - отдыхает.

Previous 16-bit versions of Microsoft C/C++ and Microsoft Visual C++ supported the long double, 80-bit precision data type. In Win32 programming, however, the long double data type maps to the double, 64-bit precision data type. The Microsoft run-time library provides long double versions of the math functions only for backward compatibility. The long double function prototypes are identical to the prototypes for their double counterparts, except that the long double data type replaces the double data type. The long double versions of these functions should not be used in new code.

The long double type is identical to the double type.

Ну а с Varinant и CDec я вообще проблем не вижу, открой VB Help и посмотри их формат. Там же и примеры. Все просто.

Ответить

Номер ответа: 7
Автор ответа:
 Djoni



Вопросов: 6
Ответов: 35
 Профиль | | #7 Добавлено: 13.04.04 12:33

Да, понятно, а я по IEEE Floating-Point ориентируюсь, а здесь пишется, что они идентичны(long double и double)

Хорошо попробую разобраться с Variant

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 13.04.04 12:42

Да тебе, собственно, нужен не сам вариант вообще, а конкретно Decimal. Открой на него справку, а также на CDec(). А то замаешься копаться в этом Variant'е...

Ответить

Номер ответа: 9
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 13.04.04 12:47

На всякий случай - MSDN

.

Decimal variables are stored as signed 128-bit (16-byte) integers scaled by a variable power of 10. The scaling factor specifies the number of digits to the right of the decimal point; it ranges from 0 through 28. With a scale of 0 (no decimal places), the largest possible value is +/-79,228,162,514,264,337,593,543,950,335. With 28 decimal places, the largest value is +/-7.9228162514264337593543950335, and the smallest nonzero value is +/-0.0000000000000000000000000001 (+/-1E-28).

Appending the literal type character D to a literal forces it to the Decimal data type. Appending the identifier type character @ to any identifier forces it to Decimal. You might need to use the D type character to assign a large value to a Decimal variable or constant, as the following example shows:

Dim BigDec1 As Decimal = 9223372036854775807 ' No overflow.

Dim BigDec2 As Decimal = 9223372036854775808 ' Overflow.

Dim BigDec3 As Decimal = 9223372036854775808D ' No overflow.

This is because without a literal type character the literal is taken as Long, and the value to be assigned to BigDec2 is too large for the Long type.

The equivalent .NET data type is System.Decimal.

Разумеется, если тебе нужна мантисса. С экспонентой тут сложновато :)

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 13.04.04 12:48

function CBig(x) as bignum

cbig.mantissa=10^(log10(x)-int(log10(x)))

cbig.exponenta=int(log10(x))

end function

Типа так.

Действия с таким типом тоже можно представить в виде функции, так как в VB нет перегрузки операторов :(

Ответить

Номер ответа: 11
Автор ответа:
 Hidden Warrior



ICQ: 479471 

Вопросов: 2
Ответов: 14
 Web-сайт: www.yxine.km.ru
 Профиль | | #11
Добавлено: 13.04.04 12:50

2 Djoni:

На этом сайте есть статья о реализации длинной арифметики. В конце статьи исходники для целых чисел. Если нужна арифметика для вещественных чисел, то сообщи мне, я вышлю на твой e-mail

Ответить

Номер ответа: 12
Автор ответа:
 Djoni



Вопросов: 6
Ответов: 35
 Профиль | | #12 Добавлено: 13.04.04 13:05

БОЛЬШОЕ СПАСИБО ВСЕМ ОТВЕТИВШИМ!!! Буду все обдумывать и что-то пробовать написать и смотреть степень приближения к рассчетам в MatchCad, если ни чего не потеряется, то должно все совпасть.

Hidden Warrior  спасибо, я сейчас все осознаю и если понадобиться попрошу у тебя с твоего разрешения.

 

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам