Jump to content

How to find the Number Closest to $X?


malu05
 Share

Recommended Posts

go through the array and do

$x - element value

then use

Abs ( expression )

store the element number if smaller than previous element or continue if larger. hope that made sense

Hmm.. what would Abs help here?

isnt there a specified command for this?

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

This is a quickie that returns "1" if the first one is closer, "2" id the second is closer, and "0"if they are equal distance in comparison to the third number

This example will return a 1 for example

$msg = _Compare(100, 200, 0)
MsgBox(0,"", $msg)

;----------
Func _Compare($Number1, $Number2, $NumToComp)
    Local $1 = Abs($NumToComp - $Number1)
    Local $2 = Abs($NumToComp - $Number2)
    Select
        Case $1 = $2
            $value = 0
        Case $1 < $2
            $value = 1
        Case $1 > $2
            $Value = 2
    EndSelect
    Return $Value
EndFunc
Edited by Paulie
Link to comment
Share on other sites

I took the time to write it for you :whistle:

both functions _ArrayMinDiff and _ArrayMaxDiff return an array with 2 values

elment

[0] gives the index at which the min difference or max difference was found and

[1] gives the min or max difference

$Array = StringSplit("4,2,6,8,12,5",",")
$min=_ArrayMinDiff($Array,6,1)
$max=_ArrayMaxDiff($Array,6,1)
ConsoleWrite('min:'&$min[0]&@CRLF&$min[1]&@CRLF&"max:"&$max[0]&@CRLF&$max[1]&@CRLF)

Func _ArrayMinDiff($F_Array,$F_Value,$i_Base=0)

    If Not IsArray($F_Array) Then
        SetError(1)
        Return ""
    EndIf
    
    Local $ArrayMinDiff[2],$i,$i_DiffValue
    $ArrayMinDiff[0]=$i_Base
    Local $i_Upper = UBound($F_Array)-1
    
    For $i= $i_Base To $i_Upper
        
        $i_DiffValue=Abs(Number($F_Array[$i])-$F_Value) 
        if $i_DiffValue<Abs(Number($F_Array[$ArrayMinDiff[0]])-$F_Value) then 
            $ArrayMinDiff[0]=$i
            $ArrayMinDiff[1]=$i_DiffValue
        EndIf
    Next

    SetError(0)
    Return $ArrayMinDiff
EndFunc

Func _ArrayMaxDiff($F_Array,$F_Value,$i_Base=0)

    If Not IsArray($F_Array) Then
        SetError(1)
        Return ""
    EndIf
    
    Local $ArrayMaxDiff[2],$i,$i_DiffValue
    $ArrayMaxDiff[0]=$i_Base
    Local $i_Upper = UBound($F_Array)-1
    
    For $i= $i_Base To $i_Upper
    
        $i_DiffValue=Abs(Number($F_Array[$i])-$F_Value) 
        if $i_DiffValue>Abs(Number($F_Array[$ArrayMaxDiff[0]])-$F_Value) then 
            $ArrayMaxDiff[0]=$i
            $ArrayMaxDiff[1]=$i_DiffValue
        EndIf

    Next

    SetError(0)
    Return $ArrayMaxDiff
EndFunc
Edited by Cue
Link to comment
Share on other sites

I took the time to write it for you :whistle:

both functions _ArrayMinDiff and _ArrayMaxDiff return an array with 2 values

elment

[0] gives the index at which the min difference or max difference was found and

[1] gives the min or max difference

$Array = StringSplit("4,2,6,8,12,5",",")
$min=_ArrayMinDiff($Array,6,1)
$max=_ArrayMaxDiff($Array,6,1)
ConsoleWrite('min:'&$min[0]&@CRLF&$min[1]&@CRLF&"max:"&$max[0]&@CRLF&$max[1]&@CRLF)

Func _ArrayMinDiff($F_Array,$F_Value,$i_Base=0)

    If Not IsArray($F_Array) Then
        SetError(1)
        Return ""
    EndIf
    
    Local $ArrayMinDiff[2],$i,$i_DiffValue
    $ArrayMinDiff[0]=$i_Base
    Local $i_Upper = UBound($F_Array)-1
    
    For $i= $i_Base To $i_Upper
        
        $i_DiffValue=Abs(Number($F_Array[$i])-$F_Value) 
        if $i_DiffValue<Abs(Number($F_Array[$ArrayMinDiff[0]])-$F_Value) then 
            $ArrayMinDiff[0]=$i
            $ArrayMinDiff[1]=$i_DiffValue
        EndIf
    Next

    SetError(0)
    Return $ArrayMinDiff
EndFunc

Func _ArrayMaxDiff($F_Array,$F_Value,$i_Base=0)

    If Not IsArray($F_Array) Then
        SetError(1)
        Return ""
    EndIf
    
    Local $ArrayMaxDiff[2],$i,$i_DiffValue
    $ArrayMaxDiff[0]=$i_Base
    Local $i_Upper = UBound($F_Array)-1
    
    For $i= $i_Base To $i_Upper
    
        $i_DiffValue=Abs(Number($F_Array[$i])-$F_Value) 
        if $i_DiffValue>Abs(Number($F_Array[$ArrayMaxDiff[0]])-$F_Value) then 
            $ArrayMaxDiff[0]=$i
            $ArrayMaxDiff[1]=$i_DiffValue
        EndIf

    Next

    SetError(0)
    Return $ArrayMaxDiff
EndFunc

Ohhh, you didnt really need to do all that for me, since it was what i tried to avoid.

Im kinda a "tiny code hugger".

[center][u]WoW Machinima Tool[/u] (Tool for Machinima Artists) [/center]

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...