iPart(и int(возвращает 0 вместо 1?

Хорошо, вот моя проблема. Я написал расширенную программу по теореме Пифагора, но, по-видимому, у нее есть исключения. Вот пример моей проблемы. Когда я ввожу A? √(3) и B? 2, я получаю 0 обратно. Вот код:

:Prompt A,C
:(C^2-A^2)->B
:If B<0
:Then
:Disp "THAT IS N
OT  A VALID TRIA
ANGLE
:Else
:If iPart(√(B))≠
√(B)
:Then
:Disp "B = √(",B
:Else
:Disp "B = ",√(B)
:End
:End

Следовательно, если B = 1, то гипотетически он должен выводить B = 1, но вместо этого выводит:

A=? √(3)
C=? 2
B = √(
              1
           Done

Что я делаю неправильно и как я могу это исправить?


person jaysoncopes    schedule 15.10.2014    source источник
comment
Какой калькулятор вы используете? Язык немного различается в зависимости от калькулятора.   -  person PGmath    schedule 18.10.2014
comment
@PGmath Я использую TI-83   -  person jaysoncopes    schedule 21.10.2014
comment
iPart( и int( не имеют к этой проблеме никакого отношения; вместо этого проблема заключается в ошибке округления калькулятора. Во второй строке вы сохраняете 4-√(3)² в B. Поскольку калькулятор округляет √(3) как десятичную дробь, √(3)² становится чуть больше 3, поэтому 4-√(3)² становится чем-то вроде 0,9999999999. Взяв iPart( из этого, вы получите 0, что вызовет проблему.   -  person user3932000    schedule 01.02.2015
comment
@ user3932000 спасибо за объяснение. Это имеет гораздо больше смысла, почему у калькулятора такая странная проблема с округлением.   -  person jaysoncopes    schedule 02.02.2015


Ответы (1)


Когда я быстро оцениваю вашу программу, кажется, что она работает правильно, когда вы получаете B≠1. Например, если я хочу рассчитать знаменитый треугольник 3,4,5, он показывает:

A=?4
C=?5
B=
                  3
               Done

По-видимому, iPart( неправильно работает с √(1). Вы можете включить дополнительный оператор в оператор If iPart( ..., чтобы исключить это. Как это.

:...
:If iPart(√(B))≠√(B) and B≠1
:...

Кроме того, я думаю, что программа выглядит чище и приятнее, если вы используете команды Input, ClrHome и Output(.

:ClrHome
:Input "A: ",A
:Input "C: ",C
:(C^2-A^2)->B
:If B<0
:Then
:Output(4,1,"THA
T IS NOT A")
:Output(5,1,"VAL
ID TRIANGLE")
:Else
:If iPart(√(B))≠
√(B) and B≠1
:Then
:Output(3,1,"B: 
√( )")
:Output(3,5,B)
:Else
:Output(3,1,"B:")
:Output(3,5,√(B))
:End
:End
:Pause
:ClrHome

Теперь экран результатов выглядит примерно так:

A: √(3)
C: 2
B: 1

Я думаю, что это чище, с 3, выровненным вместо нижнего правого угла. Когда вы нажмете ENTER, все исчезнет с экрана (из-за команды Pause).

person Roundhouse    schedule 23.10.2014
comment
Спасибо за подтверждение и предложение условного утверждения. Я ценю вклад! - person jaysoncopes; 29.10.2014