powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / минимальное изменение числа типа Double?
25 сообщений из 25, страница 1 из 1
минимальное изменение числа типа Double?
    #39133514
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть число типа Double (переменная типа Double, содержащее некоторое число).

Как вычислить минимальное число (тоже типа Double, ессно), большее этого (первого) числа?
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133518
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это не целочисленный тип данных
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133522
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Double
(double-precision floating-point)

8 bytes

-1.79769313486231E308 to -4.94065645841247E-324 for negative values;
4.94065645841247E-324 to 1.79769313486232E308 for positive values
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133557
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
математически это N + 0.(0)1

а что касается конкретно типа Double - почитайте, как устроены и хранятся числа с плавающей запятой и поймете некорректность своего вопроса
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133595
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, я уверен в корректности моего вопроса.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133599
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если уверены, то действуйте =)
почитайте про точность для начала
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133605
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

вы согласны, что в конкретном коде (на VB, например), для любого конкретного значения переменной Х1, описанной как

Dim X1 as Double, X2 as Double

Можно вычислить такое значение Х2 переменной Х2, что код

If X2 > X1 Then debug.print "OK"
If (X2 + X1)/2 = X1 Then debug.print "OK"

напечатает два "ОК"
?
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133607
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSShocker.Pro, я уверен в корректности моего вопроса.Тогда предлагаю изложить свою задачу. То есть не то, что вы хотите сделать, а для чего вам это нужно.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133610
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой вопрос о том, как это сделать МИНИМАЛЬНЫМ КОЛИЧЕСТВОМ кода (и действий).
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133615
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS, https://ru.wikipedia.org/wiki/Число_двойной_точности
Чтобы получить следующее число после текущего, надо мантиссу увеличить на 1. Желательно предусмотреть случай перехода от ненормализованного числа к нормализованному и обратно, и возможность переполнения.
А если не лезть в эти дебри - можно считать, что число двойной точности имеет точность 15 десятичных знаков, и попытаться прибавлять (число*10E-16), 2*(число*10E-16) и т.д. и проверять, изменилось число или нет. Как только изменится - Вы получили результат.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133618
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,

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

Но 15 - это тоже условность, так как имеет место двоично-десятичное преобразование, то есть останется некая приблизительность.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133619
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в итоге окажется, что у него деньги в переменных double, вместо currency =)
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133620
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSдля любого конкретного значения переменной Х1 ... Можно вычислить такое значение Х2 переменной Х2Да? Вот не согласен я, что для любого значения. Найти такие значения не сложно, но явно это не для любого значения.
Код: vbnet
1.
2.
3.
4.
5.
Dim X1 As Double, X2 As Double
X1 = 0.5
X2 = 0.6
If X2 > X1 Then Debug.Print "OK"
If Int(X2 + X1) / 2 = X1 Then Debug.Print "OK"
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133621
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТогда предлагаю изложить свою задачу. То есть не то, что вы хотите сделать, а для чего вам это нужно.

У меня в цикле срабатывает проверка

If X(i) = Porog then stop

И мне нужно сместить порог вверх на минимальную* величину, чтобы эта проверка перестала срабатывать.

(* на минимальную - потому что сверху "подпирает" ещё одно ограничение, на которое хочется не напоротоься вообще или напороться как можно позже.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133624
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приводите к целочисленному типу свои значения или форатируйте до одного знака после запятой с округлением
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133625
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
операция сравнения эквивалентности между числами с плавающей запятой - это нонсенс
что вы там меряете?
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133631
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

делаю Fast Mediana. На массивах, порождаемых EMA. Второе предложение разъяснить довольно сложно, поэтому лучше не спрашивайте, что это значит.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133723
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS,
Проще это сделать если работать с этим массивом как с 64-битными числами. К мантиссе прибавляешь 1 (или вычитаешь в зависимости от старшего бита 64 битного числа). Можно просто отобразить массив лонгов на массив вещественных, тогда никаких лишних операций не потребуется.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133756
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В коде:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Option Explicit

Private Declare Function SafeArrayAllocDescriptor _
                Lib "oleaut32.dll" ( _
                ByVal cDims As Long, _
                ByRef ppsaOut() As Any) As Long
Private Declare Function SafeArrayDestroyDescriptor _
                Lib "oleaut32.dll" ( _
                ByRef pSA() As Any) As Long
Private Declare Function GetMem4 _
                Lib "msvbvm60" ( _
                ByRef pSrc As Any, _
                ByRef pDst As Any) As Long
Private Declare Function ArrPtr _
                Lib "msvbvm60" _
                Alias "VarPtr" ( _
                ByRef pArr() As Any) As Long

Private Sub Form_Load()
    Dim d() As Double
    
    ReDim d(1000)
    
    d(0) = 20000# ' Первый член
    
    MakeDoubleSequence d()
    
    ' Проверка
    Dim i As Long
    
    For i = 0 To UBound(d) - 1
        
        Debug.Assert d(i) < d(i + 1)
        
    Next
    
End Sub

Private Sub MakeDoubleSequence( _
            ByRef d() As Double)
    Dim c() As Currency
    Dim p   As Long

    SafeArrayAllocDescriptor 1, c()
    GetMem4 ByVal ArrPtr(d()), ByVal ArrPtr(c())
    
    For p = LBound(d) To UBound(d) - 1
        
        If c(p) < 0 Then
            c(p + 1) = c(p) - 0.0001@
        Else
            c(p + 1) = c(p) + 0.0001@
        End If
        
    Next
    
    SafeArrayDestroyDescriptor c()
    GetMem4 0&, ByVal ArrPtr(c())
    
End Sub
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133820
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ATM-TURBO 2,

м-дааа ... жесть. Спасибо, конечно.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133862
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS,
Не понимаю в чем заключается жесть. Все просто, представляешь число Double как Int64 и прибавляешь 1 (убавляешь). В ЯП с указателями и соответствующими типами это делается вообще элементарно.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39133906
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иван FXS, вот допустим ищем следующее число после ПИ.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub bb()
Const FMT = "0.0000000000000000"
Dim pi As Double, pi1 As Double, d As Double, i As Long
  pi = Atn(1) * 4
  d = pi * 5E-17
  For i = 1 To 10
    pi1 = pi + d * i
    If pi <> pi1 Then Exit For
  Next
  Debug.Print Format(pi, FMT), Format(pi1, FMT), Format(pi1 - pi, "0.0E-00"), i
End Sub

Интересно, что выводятся числа как одинаковые, даже если задать знакоместа с избытком. Но разность есть:

Код: plaintext
1.
3,1415926535897900          3,1415926535897900          4,4E-16        2 

Можно увеличить множитель 5E-17 до 1E-16, но увеличится риск "проскочить" минимальное приращение.
Попробуйте присваивать переменной pi разные значения и смотрите, как меняется i.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39134285
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для этого всего есть тип decimal, но в VB6 с ним не всё просто, но варианты есть, пробуйте ищите в гугле примеры
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39134286
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ATM-TURBO 2,
а зачем нужны
Код: vbnet
1.
2.
    SafeArrayAllocDescriptor 1, c()
    SafeArrayDestroyDescriptor c()

? Закомментил эти строки - сработало так же.
...
Рейтинг: 0 / 0
минимальное изменение числа типа Double?
    #39134490
ATM-TURBO 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,
Можно убрать, но если захочешь замапить массив лонгов, то понадобится.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / минимальное изменение числа типа Double?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]