Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: How to write testable command line script?

by thechartist (Monk)
on Nov 26, 2018 at 02:15 UTC ( [id://1226313]=note: print w/replies, xml ) Need Help??


in reply to Re^3: How to write testable command line script?
in thread How to write testable command line script?

Negative numbers are only permitted in the degree column. Any minutes or seconds need to be a positive integer from 0-59 inclusive. Although an angle has a combined decimal and base 60 format, I treat the base 60 components of an angle like the fractional components of a decimal are treated; negatives get propagated to the next highest term. You can find the procedure Albert Klaf's Trigonometry Refresher on page 12; the section is available on google books. As I was going through the tests, I noticed some errors in the tests that I have no idea how they made their way into the code. I suspect they were just typos or search/replace errors I had missed. Regarding extensions to decimals -- that is a planned future extension based upon the problems in the study guide I am going through. Instead of doing the problems manually, I write a program to calculate the solutions, and learn Perl testing in the process :)

  • Comment on Re^4: How to write testable command line script?

Replies are listed 'Best First'.
Re^5: How to write testable command line script?
by pryrt (Abbot) on Nov 26, 2018 at 15:02 UTC

    That does not seem right to me. From how I understand it, -60 seconds or -1 minute is NOT the same as -1degree 59minutes. That's like saying, in time math, that subtracting 60 seconds is the same as subtracting 1 hour 59 minutes: really, in h:m:s, -60s = -0:01:00; or, in a similar procedure in decimal math, that's like saying that subtracting 10/100ths from 0 would convert -10/100 to -1/10, and then to carry the negative sign, add 10/10 and subtract 1 unit, which would be -1.90 -- when it should really be -10/100 reduces to -1/10, and then the negative sign carries out to the unit of 0, so -0.10.

    Think of it this way, in the final DMS or HMS notations, the DMS/HMS operators are a higher precedence than the unary minus operator -- so -0° 1' 0" is equivalent to -(0° 1' 0") = -(0 + 1/60 + 0/3600) = -(0 + 0/60 + 60/3600) = -60/3600 = -60 seconds

    Checking a few online calculators/converters, they seem to agree with me. (I haven't yet found something more authoritative than a calculator... but it matches my reasoning above): If I go to this online DMS converter, and change -0.0167 (which is slightly more negative than -1/60 of a degree, or -1minute), it reads -0° 1' 0.12". And on another online tool, if you start with 0° 0' 0", and subtract 0° 1' 0", you get -0° 1' 0". Can you show a reference where -60seconds is displayed as -1° 59' 0"?

      This is not a degree to decimal converter. This takes angles in deg,min,sec format (all integers) and adds or subtracts them.

      The degree min sec format is a polynomial of the form (10^x)a + (1/60)a + (1/3600)a, if we were going to express this as decimal, where a and x are integers. This is no different from any decimal, which is in powers of 10: (10^2)a + 10b + c + (10^-1)d + (10^-2)e ...; we always simplify decimal numbers by borrowing from the next highest term if subtraction is negative, and carrying excess if addition results in a number greater than equal to the base we are working in.

      The book I cited in my previous post (Trigonometry Refresher by Albert Klaf) describes the procedure on page 12. I would post the link, but I don't believe links make it through correctly. Google books has that page available.

      As for online calculators -- I have found issues with them that are not consistent with what I understand to be the algebraic properties of angle addition and subtraction. Any calculator that does not reduce 60 min to 1 degree by carrying over to the next higher term, is not correct. I will consider your argument and see if I can come up with a proof of my method, or counter-example to yours, later, if the above does not persuade you.

        This is no different from any decimal ...

        But if I have the decimal number -345, this is
            -(3*10^2 + 4*10^1 + 5*10^0)
        or
            -1 * (3*10^2 + 4*10^1 + 5*10^0)
        or
            -3*10^2 + -4*10^1 + -5*10^0
        or
            -3*10^2 - 4*10^1 - 5*10^0
        and not
            -3*10^2 + 4*10^1 + 5*10^0
        and similarly for numbers represented in sexagesimal base.

        Negative numbers are only permitted in the degree column.

        Unfortunately, if one has a d/m/s tuple  @dms = (3, 4, 5) one cannot negate it by writing -@dms. One has to negate each element:
            @neg_dms = map -1*$_, @dms;
        or (-3, -4, -5). IIUC, the notation -3° 4' 5" is equivalent to the tuple (-3°, -4', -5") analogously to decimal notation. Klaf is describing and giving an example of base-60 subtraction with borrowing, but that is not fundamentally different from base-10 subtraction.

        Update 1: Added the "Negative numbers ..." quote before the second paragraph for clarification, and various other minor wording changes and additions.

        Update 2: Here's the Klaf subtraction example in terms of normalizing everything to decimal arc-seconds, doing a decimal subtraction and reducing arc-seconds to a d/m/s tuple:

        c:\@Work\Perl\monks\thechartist>perl -wMstrict -le "sub dms_2_secs { my ($degs, $mins, $secs) = @_; ;; return $degs * 3600 + $mins * 60 + $secs; } ;; sub secs_2_dms { use integer; ;; my ($secs) = @_; ;; my $degs = $secs / 3600; $secs %= 3600; my $mins = $secs / 60; $secs %= 60; ;; return $degs, $mins, $secs; } ;; my $klaf_arc_secs = dms_2_secs(83, 18, 21) - dms_2_secs(39, 41, 28); my @klaf_dms = secs_2_dms($klaf_arc_secs); print qq{(@klaf_dms)}; " (43 36 53)
        (Update: The Klaf addition example also works correctly.) (Update: Moreover, the reversed subtraction  dms_2_secs(39, 41, 28) - dms_2_secs(83, 18, 21) yields the expected (-43 -36 -53) tuple.)


        Give a man a fish:  <%-{-{-{-<

        update: AnomalousMonk said it way better than I did. Original left for historical purposes.


        You've misunderstood. I am claiming you are representing negative angles incorrectly. After the subtraction, if you get -60 seconds, you should have the equivalent of -1min. -1min is represented canonically as -0° 1' 0", not as -1° 59' 0". The answer you list in Re^2: How to write testable command line script? of my $test_7 = [ 0, 0, -60]; my $answer_7 = [-1, 59,  0]; is wrong. Honestly, your format doesn't allow you to use the right answer, unless you know how to get perl to store the "-0" correctly (for example, using text), because it should be my $answer_7 = [-0, 1, 0];.

        regarding normal base-10 subtraction, when you subtract 0.1 from 0.0, you do NOT borrow one from the ones column, making it -1; then have 10 in the tenths column, and subtract 1, leaving 9/10ths, or -1.9. 0.0-0.1 is obviously -0.1. What you are claiming in DMS is exactly equivalent to claiming that -60sec is -1° 59' 0".

         0.0        Try borrowing: (0-1=-1).(0+10=10) => (-1).(10)
        -0.1                                            -( 0).( 1)
        ====                                            ==========
        -0.1                                             (-1).( 9)  => -1.9
        
        That's nonsensical, so obviously not the right method for subtracting a bigger from a smaller.
        
        To subtract a bigger number (M) from a smaller number (S) to do a difference D=M-S, you have to do -(S-M)=D
        So start with the S-M:
         0.1
        -0.0
        ====
         0.1
        Then negate the answer
        -0.1
        
        
        The same is true in other bases, like the base 60 of DMS:
         0°00'00"
        -0°00'60"
        ========
        ??°??'??"
        
        You start by making the bigger the first,
         0°00'60"
        -0°00'00"
        ========
        ????????
        Then simplify the top term and subtract
         0°01'00"
        -0°00'00"
        ========
         0°01'00"
        
        The negate: 
        -0°1'0"
        

        However you calculate it, whether you do it in decimal degrees, or in DMS, the only difference between -60s and +60s should be the sign at the beginning. +60s is (0° 1' 0"), and -60s is -(0° 1' 0"), which gets simplified to -0° 1' 0", exactly like -(0.016) gets simplified to -0.016 -- the negative sign is placed next to the most significant digit, but implies the whole result is negative. -0.016deg converts to -(0.016deg + 0/60 + 0/3600) = -(0 + 1/60 + 0/3600) = -(0° 1' 0"). You do not interpret -0.016 = (-0) + (0/10) + (1/100) + (6/1000) -- because that math evaluates to +16/1000, which is wrong. You evaluate -0.016 as -(0.016) = -(0 + 0/10 + 1/100 + 6/1000) = -(16/1000), which is right; or, in the other direction (-16 thousandths) = -(16 thousandths) = -(1 hundredth + 6 thousandths) = -(zero ones + 0 tenths + 1 hundredths + 6 thousandths). In the same way, -60sec = -(60sec) = -(0 + 0/60 + 60/3600) = -(0 + 1/60 + 0/3600) = -(0° 1' 0") = -0° 1' 0". Negative Degress minutes seconds (-x°y'z") is not (-x°) + (y') + (z") = -x + y/60 + z/3600, it is -(x° + y' + z") -(x + y/60 + z/3600).

        Have I said this in a way that makes my point more clear?

        the resource https://books.google.com/books?id=YRNeBAAAQBAJ&lpg=PR1&dq=Albert%20Klaf's%20Trigonometry%20Refresher&pg=PA12#v=onepage&q&f=false did not show an example when the result is negative. I do not believe you are extending into negative results correctly.

        (and linking works just fine to me: click on the LINK icon once you've navigated to the google books page, copy the URL, and paste it here between square brackets, like [https://books.google.com/books?id=YRNeBAAAQBAJ&lpg=PR1&dq=Albert%20Klaf's%20Trigonometry%20Refresher&pg=PA12#v=onepage&q&f=false].

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1226313]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (5)
As of 2024-04-16 19:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found