сравнение площадей

0 голосов
спросил 04 Авг, 05 от Гость (210,080 баллов) в категории Программные продукты Esri

Столкнулась с какой-то чепухой при элементарном сравнении площадей полигонов и не могу разобраться в чем тут дело. Может кто-то сталкивался с чем-то подобным? Подскажите, пожалуйста.

Создаю поле 10.4 из area/10000, чтобы отсечь лишнюю значность.Выделяю по определенному признаку, получаю суммарную площадь группы (2 записей порой достаточно), хоть по statistic. Сравниваю непосредственно это число (забиваю его в программу для теста) с вновь посчитанной в программе площадью группы, выводятся одинаковые числа с одинаковой значностью (10.4), но проверка на равенство порой дает отрицательный результат!image

Если бы area, то понятно, там реальная значность теряется в сумерках..., но я-то ее вроде бы обрезала!

Стала изощряться: умножать обе части на одинаковый множитель, так чтобы они стали целыми, потом еще truncate, round к ним применяла... Только round дает всегда правильный ответ. Но писать это нагромождение при каждом сравнеии... Это бред просто. Где я заблудилась?

Текст не привожу -длинно получится, и, поверьте, я знаю как писать if, и переменные все 10 раз проверила. Но если кто захочет, то нет проблем.

 

 

49 Ответы

0 голосов
ответил 08 Авг, 05 от Ivan_999 (2,900 баллов)

Вообще конечтно надо бы исходничек просмотреть скить его на www.WebFile.ru

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

0 голосов
ответил 17 Авг, 05 от Гость (210,080 баллов)

Ой, спасибо!image По техническим причинам только сейчас прочитала ответ.

Послала текст webfile.ru/463804   и фрагменты результата его работы webfile.ru/463835

В программе есть лишнее, т.к. я не стала ничего менять. И есть кое-что неоптимально сделанное, сама знаю, т.к. раньше писала. Но ведь не о том речь? Ну я там к файлу записочку приложила.

0 голосов
ответил 31 Авг, 05 от Ivan_999 (2,900 баллов)

К сожалению я тоже по тех. причинам только недавно прочитал ответ и твои файлы уже удалены с webfiles

0 голосов
ответил 01 Сен, 05 от yumakaev (5,140 баллов)

Лия, попробуйте новое поле 10.4 заполнять по формуле

(([Area]*10000).Round)/10000

Т.е. сначала умножаем на 10000, чтобы выделить 4 значащих разряда после десятичной точки; потом отрубаем остаток дробной части при помощи round; потом делим на 10000, чтобы вернуть 4 разряда в дробную часть. Можно даже для проверки результата создать поле не 10.4, а например 10.7, чтобы убедиться, что после заполнения получаются нули во всех разрядах дальше четвертого.

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

0 голосов
ответил 05 Сен, 05 от S.E. (12,840 баллов)

Если в AV для поля ограничивается количество знаков после запятой, то после произведенных вычислений программой будет произведено округление, как в вашем примере скажем до 4 знаков. При этом естественно и значение х.33338888 и х.333411111 запишутся как х.3334 и никаких хвостов у них не будет. Производя вычисления по полю 10.4 вы будете работать именно с теми значениями, которые записаны в таблицу.

   Вариант с ROUND, приведенный выше, вполне действенный.

0 голосов
ответил 06 Сен, 05 от Гость (210,080 баллов)

К сожалению я тоже по тех. причинам только недавно прочитал ответ и твои файлы уже удалены с webfiles

Ну тогда, вторая попытка: там же номера 503407 и 503413

0 голосов
ответил 06 Сен, 05 от Гость (210,080 баллов)

Лия, попробуйте новое поле 10.4 заполнять по формуле

(([Area]*10000).Round)/10000

Спасибо, я писала где-то тут что это самое и делаю, если не в поле, так при сравнении. Так все работает.image В поле, кстати, тоже делала при формировании справочника, с которого получаю потом словарь - все отлично получилось. Проблема в том, что покрытие поступает ко мне уже в готовом виде и по некоторым причинам я не могу переформировывать это поле (оно местами слегка изменяется), а навязать свои условия формирования поля тоже проблематично.

А писать такую фигню при каждом таком сравнении есть занятие бредовое по моему глубокому убеждению. И получить столь странный протокол  - это  вообще-то круто.image

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

Возникает естественный вопрос: Может моя арквьюшная копия косая?

 Что скажете? Что-то я не услышала, что хоть кто-нибудь еще получил что-то подобное.

 

0 голосов
ответил 06 Сен, 05 от Гость (210,080 баллов)

Хочу еще добавить: для того чтобы диктовать другим свои условия формирования этого поля я должна быть уверена в том, что ArcView именно так работает, и это не какая-то моя личная  или моего ArcView заморочка. Именно поэтому я обратилась на форум.

Можно как-то протестировать эту, да и некотрые другие, функции моей копии ArcView? Кое-что еще в его работе  вызывает у меня сомнения. Буду признательна, если кто подскажет чего делать-то...image

0 голосов
ответил 07 Сен, 05 от yumakaev (5,140 баллов)

Прочёл пост S.E., подумал, поэкспериментировал в ArcView, загрузил файлы с webfiles, ознакомился, ещё подумал.... уффф... image

1) AV действительно корректно обрабатывает числа, по крайней мере, в таблицах - прав S.E. image 

2) Лия, для вашей задачи нужно использовать truncate , а не round. Round будет не отбрасывать лишнюю значность, а именно округлять, что не одно и то же - соответственно, и результат будет непредсказуемый. TRUNCATE!

3) Заметил, что для округления вы пытаетесь использовать SetFormat, применяя его к объекту-числу. Я как-то никогда им не пользовался, и online help не очень-то хорошо объясняет действие этого реквеста, но заметьте, именно на нём у вас начинаются расхождения при сравнении. Вот этот-то SetFormat, возможно, и определяет только "внешность" чисел.

Попробуйте в режиме Debug посмотреть следующие вещи:

pl2.setformat("dddddddd.dddd")
pl2.setformat("dddddddd.dddddd")

Для проверки нужно, чтобы изначально pl2 имело 6-7 ненулевых разрядов после точки - посмотрите, будут ли нули в 5 и 6 разряде после выполнения второго шага. Тогда будет ясно, отсекает ли SetFormat значащие разряды, или они где-то там болтаются "в сумерках", и участвуют в операциях сравнения.

Вы утверждаете, что "писать такую фигню [round или truncate] при каждом таком сравнении есть занятие бредовое", но я как-то не вижу принципиальной разницы с применением SetFormat на каждой итерации цикла. image ?

4) Далее, в представленном алгоритме ваш 4-й вариант сравнения базируется на 3-ем - ну ясно море, что результаты этих сравнений будут одинаковые.

5) В протоколе расхождение всегда получается как pl2<plsl. Бывают ли случаи, когда pl2>plsl?

6) Ээх, переменные-бы называть как-нибудь более внятно! А то я заблудился во всех этих plgk78fh image. И отступы внутри конструкций ещё никому не помешали. image

0 голосов
ответил 07 Сен, 05 от S.E. (12,840 баллов)
По-моему, ROUND все же более правильный вариант. Округление же должно производиться при изменении разрядности.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...