Что нового

[Математика] Проверка: является ли число целым

Статус
Закрыто для дальнейших ответов.

Крепыш

Новичок
Сообщения
105
Репутация
2
Как проверить, является ли число целым?
А то выражение
Код:
IsInt(-0.05 / (0.125 + 0.05) * 7 / 2)
возвращает 0.
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Mur, непонял, зачем тут лишние скобочки?

Код:
ConsoleWrite(-0.05 / (0.125 + 0.05) * 7 / 2 &@CRLF)


Выражение равно -1

CreatoR, спасибо! Так работает.
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Они как раз таки не лишние - от их наличия зависит порядок действий и результат.
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Ок,
Код:
ConsoleWrite(-0.05 / (0.125 + 0.05) * 7 / 2 &@CRLF)
ConsoleWrite((((-0.05) / (0.125 + 0.05)) * 7) / 2 &@CRLF)

В обоих случаях результат -1

Код:
ConsoleWrite(IsInt((((-0.05) / (0.125 + 0.05)) * 7) / 2))

У Вас что возвращает? У меня 0.
И вот ещё:
Когда в выражении участвует больше одного оператора, порядок вычисления выражения определяется приоритетом операторов. Приоритеты, используемые в AutoIt даны ниже. Если два оператора имеют одинаковый приоритет - выражение вычисляется слева направо.

От высшего к низшему:

NOT
^
* /
+ -
&
< > <= >= = <> ==
AND OR

Скобки тут лишние.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Видимо там не -1, а что то типа: -1.000000000000001
Округляйте до 15 степень точности, как нибудь так:
Код:
ConsoleWrite(IsInt(Round((((-0.05) / (0.125 + 0.05)) * 7) / 2,15)))
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Да, что вы мне эти скобочки рисуете? Лишние они тут, лишние. Я даже перед отрицательными числами могу их не ставить.
Вот такой выход нашёл: если сначала умножить на 10, а потом поделить на 10, то считает нормально:
Код:
$n = 10 * -0.05 / (0.125 + 0.05) * 7 / 2 / 10
ConsoleWrite($n &@CRLF)
ConsoleWrite(IsInt($n) &@CRLF)
 

Mur

Осваивающий
Сообщения
132
Репутация
32
OffTopic:
:rofl:, вечно эти проблемы со зрением
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
то, что ответ является не целым - следствие нехватки точности компьютера для отображения действительных чисел, иначе это зовется ошибкой округления. при делении на 10, лишняя единица уходит за пределы количества возможных знаков после запятой и на его месте оказывается предыдущее число, в данном случае 0, после умножение на 10, естественно эта единица обратно не может появится в принципе. но данный подход не будет работать если ошибка возникла на двух или более последних цифрах.
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
Ну, да. Посути это операция отбрасывания последнего знака. Тогда что лучше: Round или StringIsInt ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Хм. Я один считаю что -0.05 / (0.125 + 0.05) * 7 / 2 должно быть равно -0.0816326530612245 ?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
C2H5OH
да


Добавлено:
Сообщение автоматически объединено:

детям обычно так расписывают порядок следования арифметических операций ;D
1. 0.125 + 0.05 = 0.175
2. -0.05/0.175 = -0.28571428571429
3. -0.28571428571429*7 = -2.00000000000003
4. -2.00000000000003/2 = -1.00000000000002
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Kaster
противоречивые результаты, у меня калькулятор Karce не даёт такую точность, на 3-ем пункте уже округляет до 2. AutoIt3 не даёт такую точность чтобы определить и корректирует. А вот что даёт BigNum отдельными операциями:

Код:
#include <BigNum.au3>
$sText = _BigNum_Add ( '0.125', '0.05' )
MsgBox(0, 'Сообщение', $sText)
$sText = _BigNum_Div ( '-0.05', $sText, 100 )
MsgBox(0, 'Сообщение', $sText)
$sText = _BigNum_Mul ( $sText, '7' )
MsgBox(0, 'Сообщение', $sText)
$sText = _BigNum_Div ( $sText, '2', 100 )
MsgBox(0, 'Сообщение', $sText)


InnI
InnI сказал(а):
Посмотрел функцию _BigNum_Parse изнутри, проблема в том что там точность вычислений по умолчанию, то есть всё округляется заранее и каждое последующее действие увеличивает некорректность. Думаю в эту функцию нехватало бы добавить точность, а лучше вообще ей не пользоваться сейчас, так как её точность ниже точности AutoIt3.


Теперь ясно, коррекция видимо срабатывает при определённой точности.
Код:
MsgBox(0, 'Int', _
Int(-0.99999999999999) &@CRLF& _ ; 0
Int(-0.999999999999999)) ; -1
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO [?]
противоречивые результаты
это не противоречия, а уточнения. я привел те расчеты для C2H5OH и для Mur, который уже удалил свои сообщения, чтобы убедиться, что ответ равен примерно -1, а не -0.081...
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я просто мысленно представляю это выражение на бумаге и у меня оно эквивалентно
-0.05 / ((0.125 + 0.05) * (7 / 2))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
C2H5OH
интересно, с чего бы это :smile:
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
О приоритетах знаков арифметических операций я писал выше. В AutoIt они не отличаются от принятых во всём мире (то, чему учат в школе :laugh:smile:

LD2vRPxf.png



Пока пользуюсь функцией StringIsInt()
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Лучше бы вас в школе скобками научили пользоваться
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
C2H5OH
зачем ставить скобки там где их нет? скобки нужны тогда, когда естественный порядок следования арифметических операций не соответствует желаемому порядку. уже 100500 человек выше отписались по тематике вопроса, а ты (и Mur до тебя) заладил про эти скобки
автор говорит, почему 1+2*3 != 7 в AutoIt, а ты утверждаешь, что 1+2*3 = 9 потому что у тебя мысленно и на бумаге это выражение эквивалентно (1+2)*3.

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

резюмируя,
-0.05 / (0.125 + 0.05) * 7 / 2 != -0.05 / ((0.125 + 0.05) * (7 / 2))
потому как, это противоречит данному выше порядку следования арифметических операций. на этом тема себя исчерпала. тема закрыта в связи с получением решения.
 
Статус
Закрыто для дальнейших ответов.
Верх