Оптимизация "Allow Unrounded Floating Point Operations&

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Оптимизация "Allow Unrounded Floating Point Operations&

Сообщение Mikle » 08.08.2005 (Пн) 14:23

Подскажите, кто знает, что делает данный пункт оптимизации, когда его можно применять?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2005 (Пн) 16:43

Allow Unrounded Floating-Point Operations

Allows the compiler to compare the results of floating-point expressions without first rounding those results to the correct precision.

Floating-point calculations are normally rounded off to the correct degree of precision (Single or Double) before comparisons are made. Selecting this option allows the compiler do floating-point comparisons before rounding, when it can do so more efficiently. This improves the speed of some floating-point operations; however, this may result in calculations being maintained to a higher precision than expected, and two floating-point values that might be expected to compare equal might not.

In general this option should not be used if you perform equality comparisons directly on the results of floating-point computations. For example:

Код: Выделить всё
Dim Q As Single

Q = <floating-point computation>
  …
If Q = <floating-point computation> then
  ...
End If


If the option is set, the comparison of Q will be made with the result of the floating-point expression, which will likely have higher precision than that of a Single, so the comparison may fail. If the option is not set, the result of the floating-point expression will be rounded to the appropriate precision (Single) before the comparison, then the comparison will succeed.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.08.2005 (Пн) 16:58

GSerg
Бум переводить...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.08.2005 (Пн) 19:15

По своему опыту могу сказать, что это - вторая и последняя опция, недостойная применения. Из-за нее мне как-то пришлось срочно писать свою функцию сравнения дат, т.к. штатное сравнение в VB почему-то резко начало находить различия в датах, округленных до часа (!) и равных между собой в строковом виде.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.08.2005 (Вт) 9:58

Ennor
это - вторая и последняя опция, недостойная применения.

А первая какая?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.08.2005 (Вт) 10:40

Assume No Aliasing, разумеется. Чтобы ее включить и ничего не заглючило... ну, я не знаю, как надо программу писать. Там даже "Hello world" не факт, что заработает. Грубо говоря, там получается эффект исчезновения ByRef-аргументации. Не думаю, что без этого можно написать хоть сколько-нибудь сложную программу.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.08.2005 (Вт) 14:29

Ennor
Я почти всегда включаю "Assume No Aliasing", что-то не замечал проблем. Единственное, что иногда глючило - это "Allow Unrounded Floating-Point Operations". Вот и решил разобраться.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 15:01

Никогда не включал Assume No Aliasing, и, видимо, не включу :)
Потому что с ByRef можно делать очень красивые, на мой взгляд, веши :)

Например, есть структура
Код: Выделить всё
Private Type SYSTEMTIME
  wYear As Integer
  wMonth As Integer
  wDayOfWeek As Integer
  wDay As Integer
  wHour As Integer
  wMinute As Integer
  wSecond As Integer
  wMilliseconds As Integer
End Type


Как написать функцию, которая, получив эту структуру, вернёт указанный её член?
Можно так:
Код: Выделить всё
Function GetDatePart(struct As SYSTEMTIME, MemberName As String) As Integer
  Select Case MemberName
  Case "Year"
    GetDatePart = struct.wYear
  case "Month"
    ...

  End Select
End Function




А можно так:
Код: Выделить всё
Function GetDatePart(t As SYSTEMTIME, ByRef tmember As Integer) As Integer
  GetDatePart = tmember
End Function

Sub Test
  Dim t As SYSTEMTIME

  t.wYear = 2005
  t.wMonth = 8
  t.wDay = 10
 
  MsgBox GetDatePart(t, t.wMonth)
End sub


:)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 15:06

Да, и если возникнет вопрос, почему просто не взять сразу t.wMonth - отвечаю: потому что структура хитро получается через API и иначе придётся делать арифметику с указателями - либо дублировать код :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.08.2005 (Вт) 15:39

GSerg
Только что проверил твой пример - работает скомпиленный со всеми оптимизациями. А ByRef я и сам, может и более прозаично, но постоянно использую. В VB ByRef используется по умолчанию, а для структур вообще ByVal невозможен.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.08.2005 (Вт) 16:17

GSerg
Что-то не нахожу смысла в примере, может ты что-то не дописал?
Работает и так:

Код: Выделить всё
Private Function GetDatePart(t As SYSTEMTIME, ByVal tmember As Integer) As Integer
  GetDatePart = tmember
End Function

Sub Test
  Dim t As SYSTEMTIME
  Dim t2 As SYSTEMTIME

  t.wYear = 2005
  t.wMonth = 8
  t.wDay = 10
 
  MsgBox GetDatePart(t2, t.wMonth)
End sub

Никакой разницы. :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2005 (Вт) 18:11

Да, да, да :)
Перепутал порядок действий :)

Переменная объявляется в вызывающей программе, но заполняется через API в функции GetDatePart, возвращая ту часть, которая нужна :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.08.2005 (Чт) 8:51

Все-таки хотелось бы понять :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2005 (Чт) 9:12

Код: Выделить всё
Public Property Get Month() As Variant
  Dim t As SYSTEMTIME
 
  Month = GetDatePart(t, t.wMonth)
End Property

Public Property Get Day() As Variant
  Dim t As SYSTEMTIME
 
  Day = GetDatePart(t, t.wDay)
End Property

Public Property Get Hour() As Variant
  Dim t As SYSTEMTIME
 
  Hour = GetDatePart(t, t.wHour)
End Property

Public Property Get Minute() As Variant
  Dim t As SYSTEMTIME
 
  Minute = GetDatePart(t, t.wMinute)
End Property

Public Property Get Second() As Variant
  Dim t As SYSTEMTIME
 
  Second = GetDatePart(t, t.wSecond)
End Property


Private Function GetDatePart(t As SYSTEMTIME, ByRef tmember As Integer) As Variant
  If SendMessage(h, DTM_GETSYSTEMTIME, 0, t) = GDT_VALID Then
    GetDatePart = tmember
  Else
    GetDatePart = Null
  End If
End Function



Ы? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 11.08.2005 (Чт) 11:16

Блин! Минут 10 смотрел как баран на новые ворота, пока не дошло:
В функции заполняеться структура, и сразу используеться поле для возвращаемого значения.

Интересненько! Подумаем как применять у себя :D
Очередное Спасибо!
Даже нет Внеочередное Спасибо :wink:
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.08.2005 (Чт) 12:36

Прикольно, согласен. Такого метода я еще не применял. Только вот... GSerg, объясни плиз, а нафига вообще в функции GetDatePart() первый параметр? Ведь всю эту конструкцию можно причесать в один элегантный самописный enum.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 12:39

Ennor, первый параметр и является ключевым :)
Второй параметр обозначает всего лишь смещение в первом параметре.

P.S. Выглядит офигительно красиво :) Вот только никак не могу сообразить, где его можно применить практически.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2005 (Чт) 12:43

Ага :)

Помнится, где-то у меня был пример, когда мне понадобилось один и тот же параметр передавать в функцию и как byval, и как byref :)
Ща поищем...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 12:48

И как я подозреваю, это применимо лишь к мемберам одного типа. Вернее, самой идее пофиг, какого типа будет мембер, но компилятор такое не пропустит. А так как на практике мемберы UDT обычно бывают разных типов, то применять такой подход получится не всегда.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 12:49

GSerg писал(а):и как byval, и как byref

А чем не устраивал MyProc A и MyProc (A) ? :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.08.2005 (Чт) 13:00

Не, ты не понял - одновременно, в рамках одного вызова, одну и ту же переменную как byval и как byref, двумя разными параметрами :)


Впрочем, я нашёл этот пример, и он не так интересен :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 11.08.2005 (Чт) 15:59

GSerg, не могу не отметиться :)

Тонко, элегантно, оригинально :)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 11.08.2005 (Чт) 16:21

GSerg
во завернул то как :lol:
до такого еще ведь додуматься было надо :!:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.08.2005 (Пт) 14:08

Код: Выделить всё
SendMessage(h, DTM_GETSYSTEMTIME, 0, t) = GDT_VALID

Саму ф-цию я нашел в деклараторе, с "h" разобрался - me.hwnd, а где взять константы DTM_GETSYSTEMTIME и GDT_VALID ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.08.2005 (Пт) 14:11

Из хидеров студии (скорее всего commdlg.h).
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.08.2005 (Пт) 15:14

GSerg писал(а):Ы? :)


А так, случаем не проще:

Код: Выделить всё
Public Property Get Second() As Variant
    Second = GetDatePart.wSecond
End Property

Private Function GetDatePart() As SYSTEMTIME
    Dim t As SYSTEMTIME
    ...
    GetDatePart = t
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.08.2005 (Пт) 15:29

Обращаем внимание на код.
Видим, что в случае, когда не GDT_VALID, возвращается Null.

Ы? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 12.08.2005 (Пт) 15:34

Так то оно может проще, но мы выясняли принцип, а куда применять и выгодность применения каждый решает в своем случае сам :)
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.08.2005 (Пт) 15:39

Igor_123 писал(а):Так то оно может проще

Не может, а неверно в корне, ибо нельзя вернуть Null :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 12.08.2005 (Пт) 15:43

GSerg писал(а):Обращаем внимание на код.
Видим, что в случае, когда не GDT_VALID, возвращается Null.

Ы? :)


Ну возвращай структуру со значениями Variant - что мешает?

Если на то пошло то мне изначально сие решение не нравится - допустим минуты я считал в 23:59. Далее читаю часы и получаю 0 - успели переключиться!!! А я в итоге имею в корне неверное время 0:59.

IMHO время надо считывать за один раз каким-то методом класса, а потом уже разбирать его по пропертям...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 150

    TopList