Хроники Города Глупова - вопрос знатокам (вычислительная физика)
[Recent Entries][Archive][Friends][User Info]
05:50 pm
[Link] |
вопрос знатокам (вычислительная физика) В вычислительных программах на Си, в частности, в тех, что опубликованы в Numerical Recipes in C, все операции с плавающей точкой проводятся в формате float (а не double). Скажите мне, друзья, это анахронизм, или в этом есть глубинный смысл? Учитывая то, что в книге встречаются ошибки в кодах, а также то, что адресация к массивам в Си-шных программах там начинается с единицы (я так понимаю, издержки машинного перевода кодов с Фортрана), вопрос не праздный.
Спасибо.
|
|
| |
В оригинальной (фортрановской) версии книжки NumRecipes все было сделано тоже для одинарной точности, а на дискетке к ней были помнится обе версии.
В жизни конечно имеет смысл долько двойная точность.
:-)
(Предполагая что у вас 32битная машина, конечно)
Я вот сейчас сижу, и перевожу с NumRecipes Фортрана (на котором в жизни никогда не работал) на Си, периодически заглядывая к себе в старые коды, где я переводил индексацию с фортрановской на сишную. Вообще, ноги бы вырвать тому, кто пишет директивы goto в простейших случаях, когда можно без этого атавизма обойтись.
А просто библиотеку нельзя собрать да и вызвать из Си? Или вам надо сильно менять что-то?
Надо как самый минимум перебить статические массивы на динамические, у меня размер матрицы выясняется только по ходу программы.
Аллокация-деаллокация массивов возможна и в Фортране77 -- если вы под виндой то там микрософтовые расширения есть точно Allocате/Deallocate, если нет то можно вызвать из фортрана malloc.
Потом, вы наверное можете передавать в Фортран адреса и размеры массивов, захваченных в Си. Так должно быть проще всего.
Нет в самом деле -- какая вам разница от статических массивов -- там сколько я помню везде почти передавалась аргументы и "куча" для работы -- вы ее создайте в Си и все.
Смысл этой сказки вот какой. Cast во float может иметь смысл, когда надо отрезать хвост ненужный. Вообще, в операциях с матрицами нужно очень аккуратно. Например, по возможности избегать фунцкии pow(), особенно, если надо на результат потом делить, ну и масса всякого прочего-неочевидного.
Я темный человек и не знаю Си.
:-)
На Фортране с матрицами проще, мне кажется -- и если вам не очень нужны сложные типы, то почему не сделать все что касается НумРец на фортране, а в Си только передать результаты.
Имелись ввиду функции jacobi, tqli, tred2, gaussj...
| From: | lqp@lj |
| Date: | October 27th, 2004 - 04:23 pm |
|---|
| | | (Link) |
|
Исторический, может быть. В те времена мат. сопроцессоры в массе поддерживали float, а double эмулировался программно. Или как-то так.
| From: | (Anonymous) |
| Date: | October 29th, 2004 - 06:55 am |
|---|
| | | (Link) |
|
Mitya, Marinka has Numerical Recipies in C - why don't you borrow it and stop unnecessary masturbation. Pasha
По-моему, десятилетия безуспешной борьбы с Obi-Wan errors показали, что дешевле всегда начинать индексацию с единицы, в крайнем случае жертвуя одной бесполезно потраченной ячейкой.
Спасибо, дружище! Ты мне спас рассудок. Действительно, из тех программ одна оказалась удачно прополотой, а в одной, похоже, Оби-Ван и был, однако выискивать не стал. чтобы не переписывать программу заново, я в начале вызываемых функций сделал локальные массивы (в лд - а хули мелочиться?), перегрузил туда вход, делал все операции над ними, а в конце перегружал обратно. Работает как часы теперь.
На досуге, если руки дойдут, прополю и ее, а код где-нибудь повешу.
в лд - а хули мелочиться
in long double, that is. |
|