Angle difference between two bearings: Difference between revisions

Added Algol 68
(Added Algol 68)
 
(11 intermediate revisions by 6 users not shown)
Line 864:
Difference between -154146.6649 and 1174.8381 is -161.5030
Difference between 42213.0719 and 60175.7731 is 37.2989
</pre>
 
=={{header|ALGOL 68}}==
{{Trans|11l}}
<syntaxhighlight lang="algol68">
BEGIN # angle difference between 2 bearings - translated from the 11l sample #
 
PROC wrap = (REAL v, l1, l2 )REAL:
BEGIN
REAL result := v;
WHILE result < l1 DO result +:= 2 * l2 OD;
WHILE result > l2 DO result +:= 2 * l1 OD;
result
END # wrap # ;
PROC get_difference = ( REAL b1, b2 )REAL: wrap( b2 - b1, -180.0, 180.0 );
 
OP FMT = ( REAL v )STRING:
BEGIN
STRING result := fixed( ABS v, 0, 3 );
IF result[ LWB result ] = "." THEN "0" +=: result FI;
WHILE result[ UPB result ] = "0" DO result := result[ : UPB result - 1 ] OD;
IF result[ UPB result ] = "." THEN result := result[ : UPB result - 1 ] FI;
IF v < 0 THEN "-" ELSE " " FI + result
END # FMT # ;
 
print( ( FMT get_difference( 20.0, 45.0 ), newline ) );
print( ( FMT get_difference( -45.0, 45.0 ), newline ) );
print( ( FMT get_difference( -85.0, 90.0 ), newline ) );
print( ( FMT get_difference( -95.0, 90.0 ), newline ) );
print( ( FMT get_difference( -45.0, 125.0 ), newline ) );
print( ( FMT get_difference( -45.0, 145.0 ), newline ) );
print( ( FMT get_difference( -45.0, 125.0 ), newline ) );
print( ( FMT get_difference( -45.0, 145.0 ), newline ) );
print( ( FMT get_difference( 29.4803, -88.6381 ), newline ) );
print( ( FMT get_difference( -78.3251, -159.036 ), newline ) );
print( ( newline ) );
print( ( FMT get_difference( -70099.74233810938, 29840.67437876723 ), newline ) );
print( ( FMT get_difference( -165313.6666297357, 33693.9894517456 ), newline ) );
print( ( FMT get_difference( 1174.8380510598456, -154146.66490124757 ), newline ) );
print( ( FMT get_difference( 60175.77306795546, 42213.07192354373 ), newline ) )
 
END
</syntaxhighlight>
{{out}}
<pre>
25
90
175
-175
170
-170
170
-170
-118.118
-80.711
 
-139.583
-72.344
-161.503
37.299
</pre>
 
Line 893 ⟶ 954:
180
</pre>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
Line 1,557 ⟶ 1,619:
 
=={{header|BASIC}}==
==={{header|Chipmunk Basic}}===
{{trans|Phyton}}
{{works with|Chipmunk Basic|3.6.4}}
{{works with|QBasic}}
<syntaxhighlight lang="qbasic">100 cls
110 sub getdifference(b1,b2)
120 r = (b2-b1) mod 360
130 if r >= 180 then r = r-360
140 print using "#######.######";b1;
150 print using " #######.######";b2;
160 print using " #######.######";r
170 end sub
180 print "Input in -180 to +180 range:"
190 print " b1 b2 difference"
200 print " -------------------------------------------------"
210 getdifference(20,45)
220 getdifference(-45,45)
230 getdifference(-85,90)
240 getdifference(-95,90)
250 getdifference(-45,125)
260 getdifference(-45,145)
270 getdifference(-45,125)
280 getdifference(-45,145)
290 getdifference(29.4803,-88.6381)
300 getdifference(-78.3251,-159.036)
310 getdifference(-70099.742338,29840.674379)
320 getdifference(-165313.66663,33693.989452)
330 getdifference(1174.838051,-154146.664901)
340 print
350 print "Input in wider range:"
360 print " b1 b2 difference"
370 print " -------------------------------------------------"
380 getdifference(-70099.742338,29840.674379)
390 getdifference(-165313.66663,33693.989452)
400 getdifference(1174.838051,-154146.664901)
410 getdifference(60175.773068,42213.071924)</syntaxhighlight>
{{out}}
<pre>Input in -180 to +180 range:
b1 b2 difference
-------------------------------------------------
20.000000 45.000000 25.000000
-45.000000 45.000000 90.000000
-85.000000 90.000000 175.000000
-95.000000 90.000000 -175.000000
-45.000000 125.000000 170.000000
-45.000000 145.000000 -170.000000
-45.000000 125.000000 170.000000
-45.000000 145.000000 -170.000000
29.480300 -88.638100 -118.000000
-78.325100 -159.036000 -80.000000
-70099.742338 29840.674379 -140.000000
-165313.666630 33693.989452 -73.000000
1174.838051 -154146.664901 -161.000000
 
Input in wider range:
b1 b2 difference
-------------------------------------------------
-70099.742338 29840.674379 -140.000000
-165313.666630 33693.989452 -73.000000
1174.838051 -154146.664901 -161.000000
60175.773068 42213.071924 -322.000000</pre>
 
==={{header|QBasic}}===
{{works with|QBasic|1.1}}
Line 1,671 ⟶ 1,795:
25 90 175 -175 170 -170 -117 -81 -141 -74 -160 38
</pre>
 
=={{header|BQN}}==
<syntaxhighlight lang="bqn">Adiff ← 180 - 360 | 180 + -
 
tests ← [20‿45, ¯45‿45, ¯85‿90, ¯95‿90, ¯45‿125, ¯45‿145
99‿279, 29.4803‿¯88.6381, ¯78.3251‿¯159.036
¯70099.74233810938‿29840.67437876723
¯165313.6666297357‿33693.9894517456
1174.8380510598456‿¯154146.66490124757
60175.77306795546‿42213.07192354373]
 
Round ← ⌊∘+⟜0.5⌾(1e3⊸×)
 
Round∘∾⟜(Adiff´)˘ tests</syntaxhighlight>
{{out}}
<pre>┌─
╵ 20 45 25
¯45 45 90
¯85 90 175
¯95 90 ¯175
¯45 125 170
¯45 145 ¯170
99 279 180
29.48 ¯88.638 ¯118.118
¯78.325 ¯159.036 ¯80.711
¯70099.742 29840.674 ¯139.583
¯165313.667 33693.989 ¯72.344
1174.838 ¯154146.665 ¯161.503
60175.773 42213.072 37.299
┘</pre>
 
=={{header|C}}==
Line 2,107 ⟶ 2,261:
 
=={{header|Craft Basic}}==
<syntaxhighlight lang="basic">inputprecision "angle 1:", a14
input "angle 2:", a2
 
letdefine bs1 = (a20, -s2 a1) %= 3600
 
dim b1[20, -45, -85, -95, -45, -45, 29.4803, -78.3251]
if b > 180 then
dim b2[45, 45, 90, 90, 125, 145, -88.6381, -159.036]
 
arraysize s1, b1
let b = b - 360
arraysize s2, b2
 
if s1 = s2 then
endif
 
for i = 0 to s1 - 1
if b < -180 then
 
let br = b(b2[i] +- b1[i]) % 360
 
if r >= 180 then
endif
 
let r = r - 360
print "difference: ", b
 
endif
end</syntaxhighlight>
 
print "bearing 1: ", b1[i], " bearing 2: ", b2[i], " difference: ", r
 
next i
 
endif</syntaxhighlight>
{{out| Output}}
<pre>bearing 1: 20 bearing 2: 45 difference: 25
bearing 1: -45 bearing 2: 45 difference: 90
bearing 1: -85 bearing 2: 90 difference: 175
bearing 1: -95 bearing 2: 90 difference: -175
bearing 1: -45 bearing 2: 125 difference: 170
bearing 1: -45 bearing 2: 145 difference: -170
bearing 1: 29.4803 bearing 2: -88.6381 difference: -118
bearing 1: -78.3251 bearing 2: -159.0360 difference: -80</pre>
 
=={{header|D}}==
Line 2,182 ⟶ 2,352:
=={{header|Delphi}}==
See [[#Pascal]].
=={{header|EasyLang}}==
{{trans|AWK}}
<syntaxhighlight lang=easylang>
func angdiff a b .
r = (b - a) mod 360
if r < -180
r += 360
elif r >= 180
r -= 360
.
return r
.
proc pd a b . .
print b & " " & a & " -> " & angdiff a b
.
pd 20 45
pd -45 45
pd -85 90
pd -95 90
pd -45 125
pd -45 145
pd 29.4803 -88.6381
pd -78.3251 -159.036
pd -70099.74233810938 29840.67437876723
pd -165313.6666297357 33693.9894517456
pd 1174.8380510598456 -154146.66490124757
pd 60175.77306795546 42213.07192354373
</syntaxhighlight>
 
=={{header|Erlang}}==
The real number calculations are done using integer arithmetic to better handle
Line 2,928 ⟶ 3,127:
 
=={{header|J}}==
<syntaxhighlight lang="j">relativeBearing=: 180 - 360 | 180 + -
 
tests=: _99&".;._2 noun define
<syntaxhighlight lang="j">relativeBearing=: (180 -~ 360 | 180 + -~)/"1</syntaxhighlight>
<syntaxhighlight lang="j">tests=: _99&".;._2 noun define
20 45
-45 45
Line 2,943 ⟶ 3,142:
1174.8380510598456 -154146.66490124757
60175.77306795546 42213.07192354373
)</syntaxhighlight>
)
 
tests ,. relativeBearing tests
<pre> tests ,. relativeBearing/"1 tests
20 45 25
_45 45 90
Line 2,956 ⟶ 3,156:
_165314 33694 _72.3439
1174.84 _154147 _161.503
60175.8 42213.1 37.2989</syntaxhighlightpre>
 
=={{header|Java}}==
Line 3,698 ⟶ 3,898:
1174.84 -154146.66 -161.50
60175.77 42213.07 37.30
</pre>
 
=={{header|Nutt}}==
{{trans|Java}}
<syntaxhighlight lang="Nutt">
module main
imports native.io.output.say
 
funct get_difference(b1:Float,b2:Float):Float=
var r:Float=(b2-b1)%360.0
doif r< -180.0 r=r+360.0
doif r>=180.0 r=r-360.0
yield r
return
 
 
say("Input in -180 to +180 range")
say(get_difference(20.0,45.0))
say(get_difference(-45.0,45.0))
say(get_difference(-85.0,90.0))
say(get_difference(-95.0,90.0))
say(get_difference(-45.0,125.0))
say(get_difference(-45.0,145.0))
say(get_difference(-45.0,125.0))
say(get_difference(-45.0,145.0))
say(get_difference(29.4803,-88.6381))
say(get_difference(-78.3251,-159.036))
 
say("Input in wider range")
say(get_difference(-70099.74233810938,29840.67437876723))
say(get_difference(-165313.6666297357,33693.9894517456))
say(get_difference(1174.8380510598456,-154146.66490124757))
say(get_difference(60175.77306795546,42213.07192354373))
 
end
</syntaxhighlight>
 
{{output}}
<pre>
Input in -180 to +180 range
25.0
90.0
175.0
-175.0
170.0
-170.0
170.0
-170.0
-118.1184
-80.7109
Input in wider range
-139.58328312339
-72.3439185187
-161.5029523074156
37.29885558827
</pre>
 
Line 5,224 ⟶ 5,479:
 
=={{header|Wren}}==
<syntaxhighlight lang="ecmascriptwren">var subtract = Fn.new { |b1, b2|
var d = (b2 - b1) % 360
if (d < -180) d = d + 360
3,021

edits