26 (изменено: teadrinker, 2017-08-12 02:23:56)

Re: AHK: Преобразование типов данных.

MsgBox, % FloatToHex(123.456)

FloatToHex(value)
{
   Return Format( "0x{:X}", DllCall("MulDiv", Float, value, Int, 1, Int, 1, UInt) )
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

27

Re: AHK: Преобразование типов данных.


MsgBox, % HexToFloat(0x42F6E979)

HexToFloat(x) {
   DllCall("RtlMoveMemory", "FloatP", f, "UIntP", x, "Uint", 4)
   Return f
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

28 (изменено: teadrinker, 2017-08-12 03:40:11)

Re: AHK: Преобразование типов данных.

Тогда так:

MsgBox, % FloatHexConverter(123.456)
MsgBox, % FloatHexConverter(0x42F6E979)

FloatHexConverter(source)  {
   if source is Float
      isSourceFloat := true
   DllCall( "RtlMoveMemory", isSourceFloat ? "UIntP" : "FloatP", result
                           , isSourceFloat ? "FloatP" : "UIntP", source
                           , Ptr, 4 )
   Return isSourceFloat ? Format("0x{:X}", result) : result
}

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

29

Re: AHK: Преобразование типов данных.

Может ещё Round добавить.

Return isSourceFloat ? Format("0x{:X}", result) : Round(result, 3)
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

30

Re: AHK: Преобразование типов данных.

Не, заранее же неизвестно, до какого знака округлять.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

31

Re: AHK: Преобразование типов данных.

Но в зависимости от целого должно быть как то известно какова возможная точность дроби, собственно и в примере уже не то число, вместо .456000 выходит .456001.


 Hex := FloatHexConverter(99999.99)  ;	max 2
MsgBox, % FloatHexConverter(Hex, 6)

 Hex := FloatHexConverter(9999.999)  ;	max 3
MsgBox, % FloatHexConverter(Hex, 6)

 Hex := FloatHexConverter(999.9999)  ;	max 4
MsgBox, % FloatHexConverter(Hex, 6)

FloatHexConverter(source, Round = 0)  {
   if source is Float
      isSourceFloat := true
   DllCall( "RtlMoveMemory", isSourceFloat ? "UIntP" : "FloatP", result
                           , isSourceFloat ? "FloatP" : "UIntP", source
                           , Ptr, 4 )
   Return isSourceFloat ? Format("0x{:X}", result) : result   ;	Round(result, Round)
}

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

32 (изменено: teadrinker, 2017-08-12 14:23:47)

Re: AHK: Преобразование типов данных.

serzh82saratov пишет:

Но в зависимости от целого должно быть как то известно какова возможная точность дроби

Не совсем понял, но скорее всего нет:

MsgBox, % FloatHexConverter(123.456) . "`n" . FloatHexConverter(123.456001)

FloatHexConverter(source)  {
   if source is Float
      isSourceFloat := true
   DllCall( "RtlMoveMemory", isSourceFloat ? "UIntP" : "FloatP", result
                           , isSourceFloat ? "FloatP" : "UIntP", source
                           , Ptr, 4 )
   Return isSourceFloat ? Format("0x{:X}", result) : result
}

Можно, конечно, добавить параметр, определяющий до какого знака округлять, но имхо это будет не очень красиво, т. к. в случае конвертации float в hex он будет лишним.

serzh82saratov пишет:

примере уже не то число, вместо .456000 выходит .456001

Это нормально, действия с float-числами всегда осуществляются с определённой погрешностью, это нужно учитывать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

33

Re: AHK: Преобразование типов данных.

Всем откликнувшемся большое спасибо! Код отлично подходит под мои нужды.