Хроники Города Глупова - вопрос знатокам (вычислительная физика)
October 27th, 2004
05:50 pm

[Link]

Previous Entry Add to Memories Tell A Friend Next Entry
вопрос знатокам (вычислительная физика)
В вычислительных программах на Си, в частности,
в тех, что опубликованы в Numerical Recipes in C,
все операции с плавающей точкой проводятся в
формате float (а не double). Скажите мне, друзья,
это анахронизм, или в этом есть глубинный смысл?
Учитывая то, что в книге встречаются ошибки в кодах,
а также то, что адресация к массивам в Си-шных
программах там начинается с единицы (я так понимаю,
издержки машинного перевода кодов с Фортрана), вопрос
не праздный.

Спасибо.

(16 comments | Leave a comment)

Comments
 
[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:02 am
(Link)
В оригинальной (фортрановской) версии книжки NumRecipes все было сделано тоже для одинарной точности, а на дискетке к ней были помнится обе версии.

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

:-)
[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:04 am
(Link)
(Предполагая что у вас 32битная машина, конечно)
From:[info]ded_mitya@lj
Date:October 27th, 2004 - 11:17 am
(Link)
Я вот сейчас сижу, и перевожу с NumRecipes Фортрана (на котором в жизни никогда не работал) на Си, периодически заглядывая к себе в старые коды, где я переводил индексацию с фортрановской на сишную. Вообще, ноги бы вырвать тому, кто пишет директивы goto в простейших случаях, когда можно без этого атавизма обойтись.
[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:19 am
(Link)
А просто библиотеку нельзя собрать да и вызвать из Си? Или вам надо сильно менять что-то?
From:[info]ded_mitya@lj
Date:October 27th, 2004 - 11:21 am
(Link)
Надо как самый минимум перебить статические массивы на динамические, у меня размер матрицы выясняется только по ходу программы.
[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:33 am
(Link)
Аллокация-деаллокация массивов возможна и в Фортране77 -- если вы под виндой то там микрософтовые расширения есть точно Allocате/Deallocate, если нет то можно вызвать из фортрана malloc.

Потом, вы наверное можете передавать в Фортран адреса и размеры массивов, захваченных в Си.
Так должно быть проще всего.


[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:37 am
(Link)
Нет в самом деле -- какая вам разница от статических массивов -- там сколько я помню везде почти передавалась аргументы и "куча" для работы -- вы ее создайте в Си и все.
From:[info]ded_mitya@lj
Date:October 27th, 2004 - 11:19 am
(Link)
Смысл этой сказки вот какой. Cast во float может иметь смысл, когда надо отрезать хвост ненужный. Вообще, в операциях с матрицами нужно очень аккуратно. Например, по возможности избегать фунцкии pow(), особенно, если надо на результат потом делить, ну и масса всякого прочего-неочевидного.
[User Picture]
From:[info]ex_er2000541@lj
Date:October 27th, 2004 - 11:24 am
(Link)
Я темный человек и не знаю Си.

:-)

На Фортране с матрицами проще, мне кажется -- и если вам не очень нужны сложные типы, то почему не сделать все что касается НумРец на фортране, а в Си только передать результаты.
From:[info]ded_mitya@lj
Date:October 27th, 2004 - 11:20 am
(Link)
Имелись ввиду функции jacobi, tqli, tred2, gaussj...
From:[info]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
From:[info]ded_mitya@lj
Date:October 29th, 2004 - 07:01 am
(Link)
Yo da man!
[User Picture]
From:[info]syarzhuk@lj
Date:November 1st, 2004 - 02:37 am
(Link)
По-моему, десятилетия безуспешной борьбы с Obi-Wan errors показали, что дешевле всегда начинать индексацию с единицы, в крайнем случае жертвуя одной бесполезно потраченной ячейкой.
From:[info]ded_mitya@lj
Date:November 1st, 2004 - 01:31 pm
(Link)
Спасибо, дружище!
Ты мне спас рассудок. Действительно, из тех программ одна оказалась удачно прополотой, а в одной, похоже, Оби-Ван и был, однако выискивать не стал. чтобы не переписывать программу заново, я в начале вызываемых функций сделал локальные массивы (в лд - а хули мелочиться?), перегрузил туда вход, делал все операции над ними, а в конце перегружал обратно. Работает как часы теперь.

На досуге, если руки дойдут, прополю и ее, а код где-нибудь повешу.
From:[info]ded_mitya@lj
Date:November 1st, 2004 - 01:35 pm
(Link)
в лд - а хули мелочиться

in long double, that is.
Комиссариат Культуры Powered by LJ.Rossia.org