Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / минимальное изменение числа типа Double? / 25 сообщений из 25, страница 1 из 1
21.12.2015, 17:10
    #39133514
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Есть число типа Double (переменная типа Double, содержащее некоторое число).

Как вычислить минимальное число (тоже типа Double, ессно), большее этого (первого) числа?
...
Рейтинг: 0 / 0
21.12.2015, 17:13
    #39133518
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
это не целочисленный тип данных
...
Рейтинг: 0 / 0
21.12.2015, 17:14
    #39133522
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
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
21.12.2015, 17:30
    #39133557
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
математически это N + 0.(0)1

а что касается конкретно типа Double - почитайте, как устроены и хранятся числа с плавающей запятой и поймете некорректность своего вопроса
...
Рейтинг: 0 / 0
21.12.2015, 17:50
    #39133595
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Shocker.Pro, я уверен в корректности моего вопроса.
...
Рейтинг: 0 / 0
21.12.2015, 17:53
    #39133599
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
если уверены, то действуйте =)
почитайте про точность для начала
...
Рейтинг: 0 / 0
21.12.2015, 17:58
    #39133605
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
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
21.12.2015, 17:59
    #39133607
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван FXSShocker.Pro, я уверен в корректности моего вопроса.Тогда предлагаю изложить свою задачу. То есть не то, что вы хотите сделать, а для чего вам это нужно.
...
Рейтинг: 0 / 0
21.12.2015, 18:00
    #39133610
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Мой вопрос о том, как это сделать МИНИМАЛЬНЫМ КОЛИЧЕСТВОМ кода (и действий).
...
Рейтинг: 0 / 0
21.12.2015, 18:01
    #39133615
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван FXS, https://ru.wikipedia.org/wiki/Число_двойной_точности
Чтобы получить следующее число после текущего, надо мантиссу увеличить на 1. Желательно предусмотреть случай перехода от ненормализованного числа к нормализованному и обратно, и возможность переполнения.
А если не лезть в эти дебри - можно считать, что число двойной точности имеет точность 15 десятичных знаков, и попытаться прибавлять (число*10E-16), 2*(число*10E-16) и т.д. и проверять, изменилось число или нет. Как только изменится - Вы получили результат.
...
Рейтинг: 0 / 0
21.12.2015, 18:04
    #39133618
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Казанский,

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

Но 15 - это тоже условность, так как имеет место двоично-десятичное преобразование, то есть останется некая приблизительность.
...
Рейтинг: 0 / 0
21.12.2015, 18:04
    #39133619
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
в итоге окажется, что у него деньги в переменных double, вместо currency =)
...
Рейтинг: 0 / 0
21.12.2015, 18:05
    #39133620
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван 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
21.12.2015, 18:05
    #39133621
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Shocker.ProТогда предлагаю изложить свою задачу. То есть не то, что вы хотите сделать, а для чего вам это нужно.

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

If X(i) = Porog then stop

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

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

делаю Fast Mediana. На массивах, порождаемых EMA. Второе предложение разъяснить довольно сложно, поэтому лучше не спрашивайте, что это значит.
...
Рейтинг: 0 / 0
21.12.2015, 19:41
    #39133723
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван FXS,
Проще это сделать если работать с этим массивом как с 64-битными числами. К мантиссе прибавляешь 1 (или вычитаешь в зависимости от старшего бита 64 битного числа). Можно просто отобразить массив лонгов на массив вещественных, тогда никаких лишних операций не потребуется.
...
Рейтинг: 0 / 0
21.12.2015, 20:23
    #39133756
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
В коде:
Код: 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
21.12.2015, 21:23
    #39133820
Иван FXS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
ATM-TURBO 2,

м-дааа ... жесть. Спасибо, конечно.
...
Рейтинг: 0 / 0
21.12.2015, 22:02
    #39133862
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван FXS,
Не понимаю в чем заключается жесть. Все просто, представляешь число Double как Int64 и прибавляешь 1 (убавляешь). В ЯП с указателями и соответствующими типами это делается вообще элементарно.
...
Рейтинг: 0 / 0
21.12.2015, 22:43
    #39133906
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
Иван 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
22.12.2015, 11:44
    #39134285
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
для этого всего есть тип decimal, но в VB6 с ним не всё просто, но варианты есть, пробуйте ищите в гугле примеры
...
Рейтинг: 0 / 0
22.12.2015, 11:45
    #39134286
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
минимальное изменение числа типа Double?
ATM-TURBO 2,
а зачем нужны
Код: vbnet
1.
2.
    SafeArrayAllocDescriptor 1, c()
    SafeArrayDestroyDescriptor c()

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


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