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

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

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

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

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

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

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

 

 

49 Ответы

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

Ну неужто опять не получили?????image Я отправила еще несколько часов назад и теперь убедилась, что никаких возвратных сообщений о недоставке не пришло, все прошло! Куда же оно делось?image Адрес просто скопировала, так что ошибки быть не могло...

 

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

Пока получил только письмо с адреса на from.ru .  Никаких данных как не было, так и нет image. Может, проще выложить их на том же сайте, что раньше, и прислать мне номер?

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

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

Выложила zip-архив на Webfile под номером 515808, но там тоже началась какая-то чепуха, чего раньше никогда не было!

Я сегодня, 13.09.05 в 9.43 выкладываю файл, а она мне говорит:"Ваш файл будет доступен в течение 7 дней до 13.09.05 9.43"image

Как Вам это нравится????? Попробуйте скачать! Боюсь, что " проблемы связи" приобретают тут самое ключевое значение!image

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

Под номером 515820 туда же выложила письмо с некоторыми пояснениями. Аналогичное сообщение имела счастье лицезреть вновь.

Надеюсь, что, несмотря на странности поведения, файлы скачаются, архив успешно распакуется (проверяла!) и тема загрузится в проект. Хотя я теперь уже ни в чем не уверена.image

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

Лия, данные успешно дошли и до моего ящика, и скачались с webfiles.

Я немного поправил программу для удобства восприятия результатов (и ещё из-за установок на моей машине AV не понимает русские буквы в скриптах, так что все пришлось перевести на английский).

Первое, что выяснилось - дело всё-таки в SetFormat, который определяет "внешний вид" чисел, но не влияет на их обработку.

В самом начале программы я сделал следующее:
number.setdefformat("ddddddd.ddddddddddddddd")
Все остальные SetFormat безжалостно удалил.

И вот самые живописные фрагменты протокола:

017 ROUND.For 03 53 022 sums are equal pl2r=33738831.000000000000000 plslr=33738831.000000000000000
018 TRUNC.For 03 53 022 sums are equal pl2t=33738831.000000000000000 plslt=33738831.000000000000000
019 AS_IS.For 03 53 022 pl2=0003373.883100000000000 < plsl=0003373.883100000000500
020 MULTI.For 03 53 022 pl2m=33738831.000000000000000 < plslm=33738831.000000007000000
 
.....
 
029 ROUND.For 06 16 023 sums are equal pl2r=17868846.000000000000000 plslr=17868846.000000000000000
030 TRUNC.For 06 16 023 sums are equal pl2t=17868846.000000000000000 plslt=17868846.000000000000000
031 AS_IS.For 06 16 023 pl2=0001786.884600000000100 > plsl=0001786.884599999999900
032 MULTI.For 06 16 023 sums are equal pl2m=17868846.000000000000000 plslm=17868846.000000000000000
 
033 ROUND.For 07 69 007 sums are equal pl2r=12952459.000000000000000 plslr=12952459.000000000000000
034 TRUNC.For 07 69 007 sums are equal pl2t=12952458.000000000000000 plslt=12952458.000000000000000
035 AS_IS.For 07 69 007 sums are equal pl2=0001295.245899999999900 plsl=0001295.245899999999900
036 MULTI.For 07 69 007 sums are equal pl2m=12952458.999999998000000 plslm=12952458.999999998000000
 
Откуда всё это берётся, буду дальше разбираться. Особенно интересны превращения чисел во время умножения.

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

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

 Огромнейшее Вам спасибо за эксперимент!image Попробовала его повторить и получила аналогичные результаты. Сама я уже, наверное, выдохлась с этими тестами и мозги зациклились.image  Конечно, буду рада прочитать до чего Вы еще додумаетесь.
Но в связи с этим всем  у меня снова возникают вопросы:
1. Допустим что-то там при сложении-умножении сбоит (что тоже весьма странно, но об этом потом),
 но как в pl2, которое получено путем прямого чтения из таблицы с разрядностью 10.4 могло быть  какое-то 100 в 13м разряде?
2. И что, никто в целом мире кроме меня площади не  сравнивает ?????image Ибо я искала сообщения на эту
тему и на esri.com. НЕТУ!!! По разным ключевым словам искала, между прочим.
3.Если, допустим, сложение сбоит, то это должно было проявиться и в других случаях! Но что-то я тоже не
слыхала никогда ничего подобного.

Суть, конечно, не в setformat, хотя для протокола именно это дает такой эффектный результат. Суть в том, что программа (не эта, тестовая, а рабочая) стала выдавать черт знает что, потому и тест появился.
Смысл-то в неверном результате сравнения, которое будет иметь место и без всяких форматов.
Я не в силах поверить, что все пользователи молча используют ROUND и не задаются подобными вопросами.
Единственное, что мне кажется разумным - сбоит какая-то из версий AV. И чтобы определиться с этим у меня
просьба ко всему прогрессивному человечеству: Люди! imageЯ снова закачала тестовую программу на webfile под
номером 517623 (кстати, не знаю что случилось с webfile ,но опять имело место столь же странное сообщение,
как и в прошлый раз). Данные тоже там, номер в предыдущем посте. Пожалуйста, у кого есть возможность,
скачайте все это безобразие и протестируйте. Надо же менять на что-то такое AV, но вот на что? И вообще может у кого какие умные мысли появятся...


 

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

1. Допустим что-то там при сложении-умножении сбоит ... , но как ... путем прямого чтения из таблицы с разрядностью 10.4 могло быть какое-то 100 в 13м разряде?

Вот с этим и будем разбираться. Откуда появляются эти хвосты при чтении, сложении, умножении и т.п. Где-то там порылась-таки собака. Возможно, где-то в ваших данных эти хвосты незаметно поживают, и их не видно, пока не начинаете сравнивать. Возможно, где-то надо что-то у AV подкрутить, чтобы она корректно обрабатывала числа с такой разрядностью... Бу'м искать.

2. И что, никто в целом мире кроме меня площади не  сравнивает ?

Да дело-то не в площадях, а в обработке чисел. См. п.1. image!

Спокойствие, только спокойствие!

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

image Новые шокирующие результаты экспериментов image

Лия, создайте в справочнике (kadbl_kv.dbf) новое поле формата 20.13 , и пересчитайте в нём значения по полю Pl (которое вроде бы 10.4). Вы получите мноооого чисел вида 2145.1918000000001 и 1854.0447999999999 image

Далее, попробуйте создать поле формата 20.12, и пересчитайте его теперь уже по полю 20.13. Всё вроде бы становится на свои места, например, числа выше округляются до 2145.191800000000 и 1854.044800000000.

Но теперь создайте ещё одно поле формата 20.13, и пересчитайте его по 20.12 - все хвосты вылезут опять image

Почему так получается - всё ещё вопрос. Я провёл и другой эксперимент: создал совершенно новую пустую таблицу, в ней три поля (24.14, 10.4, и ещё раз 24.14), и прогнал по ним пару случайных чисел:

   0.12339999999990
2345.12339999999990

Сначала в поле 10.4 они, как и предполагалось, превращаются в

   0.1234
2345.1234

А дальше, при новом пересчёте в 24.14 , результаты ошеломляют:

   0.12340000000000
2345.12339999999990

Вот тебе, бабушка, и рокенролл.

Следовательно, всё дело в обработке чисел с двойной точностью. В файлах dBase (который и есть dbf), числа с плавающей точкой хранятся в формате Double: Signed 64-bit IEEE double-precision floating point number (8 bytes) (см. http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf). Хоть какой там формат задай (10.4 или 24.14, не важно), всё равно внутри получится Double. 

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

Так что вердикт: обрезайте все теоретически возможные хвосты ДО их занесения в таблицы и ДО сравнения. Не стесняйтесь использовать Round, там где это нужно, хотя вы уже высказали своё отношение к этому image. Я подозреваю, что таков уж характер ваших данных - где-то там всё время появляется значность до 13 разряда. Раз уж это так, придётся их ROUND-ом.

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

Тут даже еще смешнее получается. Выполнив те же пересчеты из 24.14 в 10.4 и снова в 24.14 на следующих цифрах получим такой же результат:

2456.12339999999990    2456.1234     2456.12339999999990

2456.12339999999900      &nbsp ;      2456.1234     2456.12339999999990

2456.12339999900000      &nbsp ;      2456.1234     2456.12339999999990

2456.12339999000010      &nbsp ;      2456.1234     2456.12339999999990

Загадка....

0 голосов
ответил 15 Сен, 05 от Гость (210,080 баллов)
Откуда появляются эти хвосты при чтении, сложении, умножении и т.п. Где-то там порылась-таки собака. Возможно, где-то в ваших данных эти хвосты незаметно поживают, и их не видно, пока не начинаете сравнивать. Возможно, где-то надо что-то у AV подкрутить, чтобы она корректно обрабатывала числа с такой разрядностью... Бу'м искать.

Да-с... А почему эти хвосты только у меня поселились? imageНу теперь еще вот у Вас, с моей подачи?image Ведь иначе это же должно везде вылазить? Я же не делаю ничего необычного!image Кто б сказал чего именно подкрутить, чтобы влиться в счастливые ряды обычных пользователей???

Да дело-то не в площадях, а в обработке чисел.

Конечно! Но как Вы догадываетесь, это только усугубляет ситуацию.image

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...