Как организовать логические операции над вещественными числами?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Прочее. Программное обеспечение > Как организовать логические операции над вещественными числами?

Как организовать логические операции над вещественными числами?

Ответ
Поиск в этой теме
Непрочитано 14.02.2020, 14:57 #1
Как организовать логические операции над вещественными числами?
nickname2019
 
Регистрация: 18.11.2019
Сообщений: 1,705

Мне нужно организовать основные логические операции над числами с плавающей точкой (например - X и Y).

Как организовать операции AND и OR я разобрался.

X AND Y эквивалентно X*Y (умножить).

X OR Y эквивалентно X+Y (сложить).

Не могу понять, как сделать оператор NOT.
Просмотров: 5531
 
Непрочитано 14.02.2020, 16:56
#2
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,171


Может компетентные люди поняли все сразу, но я, полный ламер, насилил. Какой смысл имеют логические операции над числами с плавающей точкой?
kp+ вне форума  
 
Непрочитано 14.02.2020, 16:59
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Offtop: Переводи в двоичную систему и смотри, что и как получается
0 = 0 => !0 = 1
1 = 1 => !1 = 0
2 = 10 => !2 = 1
3 = 11 => !3 = 0
4 = 100 => !4 = 3
Ну и т.д. )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.02.2020, 17:02
#4
Бахил

?
 
Регистрация: 17.06.2014
Царицын
Сообщений: 12,796


Минус(-).
А тебе зачем?
__________________
Меньше знаешь - крепче зубы.
Бахил вне форума  
 
Непрочитано 14.02.2020, 17:31
#5
bigden


 
Регистрация: 05.08.2008
Сообщений: 828


инвертировать нужно каждый бит. например из нуля вычесть число

----- добавлено через ~2 мин. -----
нет не так. нужно из самого большого (чтобы все биты были единицами) вычесть твое число
bigden вне форума  
 
Автор темы   Непрочитано 20.02.2020, 14:19
#6
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Бахил Посмотреть сообщение
Минус(-).
А тебе зачем?
Допустим
h-ширина колонны (вещественное число, с плавающей точкой).

Если юзер задал ширину колонны - работаем дальше, если нет - останавливаемся.

Код:
[Выделить все]
 Сейчас код выглядит примерно так:

#If|(h)
  //Ничего не делаем, программа пропустит это условие и пойдет дальше
#Else
  #MsgBox|Укажите значение ширину колонны "h"
  #Return|False
#EndIf

А хочу, чтобы было так

#If|(NOT h) 
    #MsgBox|Укажите значение ширину колонны "h"
    #Return|False
#EndIf
nickname2019 вне форума  
 
Непрочитано 20.02.2020, 14:22
1 | #7
Бахил

?
 
Регистрация: 17.06.2014
Царицын
Сообщений: 12,796


EMPTY
__________________
Меньше знаешь - крепче зубы.
Бахил вне форума  
 
Автор темы   Непрочитано 20.02.2020, 14:26
#8
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Бахил Посмотреть сообщение
EMPTY
Спасибо. А может считать, что отрицательные double == FALSE?
Тогда NOT - можно на минус 1 умножать.

С нулем только не понятки.

Последний раз редактировалось nickname2019, 20.02.2020 в 14:36.
nickname2019 вне форума  
 
Непрочитано 20.02.2020, 19:16
| 1 #9
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
#If|(NOT h)
****#MsgBox|Укажите значение ширину колонны "h"
Ну зачем так-то, да мучиться с проверками? Во всех системах программирования давно имеются элементы ввода, просто не позволяющие ввести неверные значения. Это и маски ввода, и списки выбора, и "спины". Их применение гарантирует получение только допустимых данных.

Если же два размера надо, то надо и одновременно два элемента использовать, а не последовательно.

Что касается сравнения вещественных чисел, хоть друг с другом, хоть с "истиной", то обычный путь - преобразование чисел в строки с заданным количеством десятичных знаков и сравнение уже строк.
ShaggyDoc вне форума  
 
Непрочитано 20.02.2020, 20:13
#10
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
преобразование чисел в строки с заданным количеством десятичных знаков и сравнение уже строк.
а разве не быстрее будет:
| A - B | < 0,5 * заданное количество десятичных знаков
чем преобразование в строку, а потом еще сравнение строк?
Сергей812 вне форума  
 
Непрочитано 21.02.2020, 07:19
#11
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а разве не быстрее будет:
| A - B | < 0,5 * заданное количество десятичных знаков
чем преобразование в строку, а потом еще сравнение строк?
В каком-то частном случае - быстрее. Но кому разница в каких-то миллисекундах нужна? В других случаях придется иное сравнение придумывать.

И есть еще много факторов для вещественных чисел, зависящих и от среды программирования и даже от процессора. Да еще и сюрпризы от Microsoft. Вот статья Неочевидные особенности вещественных чисел с обзором для Delphi. В других средах что-то подобное.

И, чтобы не напрягать свои мозги каждый раз, надо просто иметь библиотечные функции для сравнения. Да они давно сделаны.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.02.2020, 09:47
#12
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
В каком-то частном случае - быстрее. Но кому разница в каких-то миллисекундах нужна? В других случаях придется иное сравнение придумывать.

И есть еще много факторов для вещественных чисел, зависящих и от среды программирования и даже от процессора. Да еще и сюрпризы от Microsoft. Вот статья Неочевидные особенности вещественных чисел с обзором для Delphi. В других средах что-то подобное.

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

Я пишу свой язык. Он нетипизированный, т.е. в нем не разделяются целые и вещественные числа. А логические операции нужно как-то описывать.
Обычно ноль - FALSE, не ноль - TRUE.

В моем случае, склоняюсь, что если число отрицательное и ноль - должно быть FALSE.
В этом случае OR сложнее описывается (простой суммой не обойтись). Если одно из чисел положительное - его и возвращает.

или OR - просто возврат максимального значения из двух чисел, это более близко реальности.

т.е.
X OR Y
эквивалентно
MAX(X,Y)

, где MAX - функция, возвращающая максимум из двух чисел.


Пустая переменная, видимо, тоже должна квалифицироваться как FALSE.

Последний раз редактировалось nickname2019, 21.02.2020 в 10:18.
nickname2019 вне форума  
 
Непрочитано 21.02.2020, 10:16
#13
bigden


 
Регистрация: 05.08.2008
Сообщений: 828


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Пустая переменная
вы на каком языке свой ЯП пишете
bigden вне форума  
 
Автор темы   Непрочитано 21.02.2020, 10:22
#14
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от bigden Посмотреть сообщение
вы на каком языке свой ЯП пишете
Выглядит примерно как в посте #6. Компилятор на c++. Название языка пока не придумал.
Может #Glagol назову. Только "Глагол" в русской транскрипции один псих (в хорошем смысле) для языка программирования уже забронировал (он в нем все операторы на русском сделал, очень странно выглядит).
nickname2019 вне форума  
 
Непрочитано 21.02.2020, 10:32
#15
bigden


 
Регистрация: 05.08.2008
Сообщений: 828


как-то интуитивно непонятно у вас получится. если булевы операции, то должны быть булевы операции. а у вас отрицательное число это false получается

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от nickname2019 Посмотреть сообщение
все операторы на русском сделал, очень странно выглядит
ну вот американцы вот так вот на своем языке все ключевые слова и видят. ничего, живут как-то. а вообще к такому языку на русском ИДЭ добавить и все школоло перейдут с паскаля на него
bigden вне форума  
 
Непрочитано 21.02.2020, 10:38
#16
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
В моем случае, склоняюсь, что если число отрицательное и ноль - должно быть FALSE.
Нет гарантии, что процессор вернет не отрицательное и ноль, а "чуть-чуть положительное". Занимаясь написанием своего "2001 языка" об этом надо помнить.
Цитата:
Сообщение от bigden Посмотреть сообщение
все школоло перейдут с паскаля на него
Был уже такой язык. "Ершик" назывался по фамилии создателя. Официально "Русский алгоритмический язык". Отбивал у школоты желание заниматься "информатикой".

Последний раз редактировалось ShaggyDoc, 21.02.2020 в 10:44.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 21.02.2020, 10:43
#17
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от bigden Посмотреть сообщение
как-то интуитивно непонятно у вас получится. если булевы операции, то должны быть булевы операции. а у вас отрицательное число это false получается
Да. В стандарте языка придется оговорить, что отрицательное число, ноль и пустая переменная - в условных переходах квалифицируются как FALSE.
Просто есть задача описать основные булевые операции для нетипизированных переменных (на самом деле - double) примерно в том виде, как в нормальном языке, чтобы выглядело и работало стандартно.

Цитата:
ну вот американцы вот так вот на своем языке все ключевые слова и видят. ничего, живут как-то. а вообще к такому языку на русском ИДЭ добавить и все школоло перейдут с паскаля на него
Если весь мир пишет ключевые слова в языках переменных на английском, переходить на русский - это очень странно. Америкосы спутник называют русским словом - и нормально. Переменные - да, их надо сделать, чтобы и на русском можно было задавать.

----- добавлено через ~2 мин. -----
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Нет гарантии, что процессор вернет не отрицательное и ноль, а "чуть-чуть положительное". Занимаясь написанием своего "2001 языка" об этом надо помнить.
Да, сравнение реальных чисел нужно делать с учетом допуска вычислений.
nickname2019 вне форума  
 
Непрочитано 21.02.2020, 10:48
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Offtop: Вариант русского языка программирования, кажется, в 1С реализован. Выглядело действительно дико.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.02.2020, 10:52
#19
bigden


 
Регистрация: 05.08.2008
Сообщений: 828


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
В стандарте языка придется оговорить, что отрицательное число, ноль и пустая переменная
и в терминологию придется другую придумать. это уже не булевы операции будут. найдется обязательно человек, который гуаном закидает.

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
пустая переменная
а что это такое? не инициализированная?
bigden вне форума  
 
Автор темы   Непрочитано 21.02.2020, 11:00
#20
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от bigden Посмотреть сообщение
и в терминологию придется другую придумать. это уже не булевы операции будут. найдется обязательно человек, который гуаном закидает.
На самом деле, мы просто привыкли к двоичной логике. В СССР были компьютеры с троичной системой исчисления (см. компьютер "Сетунь"). Для него гармоничнее была бы троичная логика (-, 0 , +). И логический оператор перехода тоже можно делать троичным ("if0" "else+" "else-" ). Но это для восприятия сложнее, в бинарных переходах бывает трудно разобраться.
Цитата:
а что это такое? не инициализированная?
Да. Когда переменная где то создана, но не инициализирована значением.
nickname2019 вне форума  
 
Непрочитано 21.02.2020, 11:16
#21
bigden


 
Регистрация: 05.08.2008
Сообщений: 828


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вариант русского языка программирования, кажется, в 1С реализован. Выглядело действительно дико
однакож такой язык любой бухгалтер осваивает запросто. и клепает там что-то. а иностранный является препятствием, нужен специалист, которого пять лет нужно обучать
bigden вне форума  
 
Непрочитано 22.02.2020, 20:37
#22
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Да. Когда переменная где то создана, но не инициализирована значением.
вы ассемблер пишете? на языках высокого уровня обычно сам компилятор вставляет инструкции при присвоению дефолтного значения переменной по ее типу при отсутствии явной инициализации.
Сергей812 вне форума  
 
Автор темы   Непрочитано 23.02.2020, 09:21
#23
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вы ассемблер пишете? на языках высокого уровня обычно сам компилятор вставляет инструкции при присвоению дефолтного значения переменной по ее типу при отсутствии явной инициализации.
Я пишу и скрипт и интерпретатор для него, когда инструкции языка распознаются интерпретатором и вызываются те или иные команды. Сам интерпретатор и базовые команды написаны на c++. Соответственно, когда переменная появляется в тексте программы (программу пишет юзер), мне самому (так как я пишу интерпретатор) приходится выделять под нее память и инициализировать либо NULL, либо значением.
Юзер, соответственно, сам создает команды на этом скрипте, названия которому пока нет.

Скрипт напоминает бэйсик, только нетипизированный.


Окончательная версия логических операций (с учетом того, что ноль и отрицательные числа - false) имеет вид
X OR Y эквивалентно MAX(X,Y)
X AND Y эквивалентно MIN(X,Y)

NOT X получается более сложным оператором

Код:
[Выделить все]
  const tool=0.00001;//точность вычислений

  double NOT(double X){
  if (abs(X)>tool){//не равно нулю
    X=(-1)*X;//меняем знак
  }else{
    X=1;//для нуля делаем просто положительным числом, пусть это будет единица
  }
  return X;
}

Последний раз редактировалось nickname2019, 23.02.2020 в 09:56.
nickname2019 вне форума  
 
Непрочитано 23.02.2020, 10:20
#24
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


а вы принимаете в расчет, что с этим придумыванием экзотических записей операций в своем скриптовом языке в итоге получиться как с лиспом - что он стоит "отдельно" от других языков программирования вследствие своей списочной сущности, синтаксиса и прочего? Для обычного пользователя лучше вообще что-то визуальное делать, со всякими мастерами-помощниками пошаговыми, имхо. А для продвинутых предоставлять API.
Сергей812 вне форума  
 
Автор темы   Непрочитано 23.02.2020, 10:45
#25
nickname2019


 
Регистрация: 18.11.2019
Сообщений: 1,705


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
а вы принимаете в расчет, что с этим придумыванием экзотических записей операций в своем скриптовом языке в итоге получиться как с лиспом - что он стоит "отдельно" от других языков программирования вследствие своей списочной сущности, синтаксиса и прочего? Для обычного пользователя лучше вообще что-то визуальное делать, со всякими мастерами-помощниками пошаговыми, имхо. А для продвинутых предоставлять API.
Вы подняли тему, до решения которой я пока не дошел.

Я пока думаю, что нужно дать возможность из скрипта вызывать лисповые функции, которые будет выполнять внешний обработчик (в моем случае, обработчик - автокад, и скрипт выполняется внутри автокада). Соответственно, мне нужно будет придумать механизм передачи переменных в лисп-функцию и получения результатов назад.

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

Но автоматизация скрипта - это я не скоро буду делать. Я еще с базовые функции не совсем закончил.

Последний раз редактировалось nickname2019, 23.02.2020 в 12:58.
nickname2019 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Прочее. Программное обеспечение > Как организовать логические операции над вещественными числами?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли организовать деформационный шов в существующей фундаментной плите Igor1985 Основания и фундаменты 15 08.11.2016 15:52
Как в Solidworks скрыть/неотображать отдельные операции. Трубопровод. vamesc SolidWorks 3 08.10.2014 19:03
Возможны ли булевы операции над сетями? Tannik AutoCAD 6 14.02.2011 13:38
Как пристроить вплотную новую несущую стену к старой и при этом организовать фундамент Lexa Основания и фундаменты 4 05.10.2009 11:03
Как организовать уловие функцией if? Kostinok Программирование 6 30.07.2008 10:07