Вдохновленный статьей diamond'а, накачал сишных компиляторов и начал экспериментировать. И тут вспомнил, что у меня есть отличная игрушка, написанная мной на c++, которую было бы неплохо портировать в КолибриОС. Взялся за переделку... и тут же столкнулся с проблемой, а именно с отсутствием математических функций в сишных компиляторах, делающих колибри-файлы.
Поэтому прошу помощи в реализации на ассемблере следующих функций: sqrt, cos, acos, sin, round. На сколько мне известно, это довольно-таки легко сделать, используя FPU.
Буду благодарен за любую помощь.
Математические функции
Насчет sqrt, cos, acos, sin помогу - стучи в асю или в irc заходи, а про round не слышал - что это вообще?
Ненужно ничего реализовавать - все математические функции уже есть.
Напиши в заголовке твой сишной программы
#include <math.h>
И пользуйся математическими фугкциями.
Я под Linux-ом установил menuetlibc.Написал тестовую программу с использованием математических функций.Скомпилировал и опробовал в Колибри - все отлично работало.
Напиши в заголовке твой сишной программы
#include <math.h>
И пользуйся математическими фугкциями.
Я под Linux-ом установил menuetlibc.Написал тестовую программу с использованием математических функций.Скомпилировал и опробовал в Колибри - все отлично работало.
Если надо,то могу выложить скомпилированную библиотеку libc.a для компиляции с использованием GCC или TinyC-compilera.
Last edited by andrew_programmer on Wed Feb 28, 2007 7:37 pm, edited 1 time in total.
Тебе нужно помочь реализовать(я так понял на асме) или просто алгоритмы??? По запросу в гугле на "математические алгоритмы" сразу попал на сайт http://algorithm.narod.ru/
там есть реализация на си алгоритмов тангенса синуса и т.п.
Если именно проблема с реализацией, то конкретно что именно нужно??? Просто написать их?
там есть реализация на си алгоритмов тангенса синуса и т.п.
Если именно проблема с реализацией, то конкретно что именно нужно??? Просто написать их?
Статья в тему:
http://club.shelek.com/viewart.php?id=101
http://club.shelek.com/viewart.php?id=101
Мдя.. Посмотрел я по-подробнее свой компилятор (cl из VS 2005). Вот на такой код:
Выдает вот такое:
(естественно все делал как говорилось в вышеупомянутой статье)
Code: Select all
#include "kosSyst.h"
#include "kosFile.h"
void kos_Main()
{
double id = 10.4;
}
Code: Select all
LINK : warning LNK4108: /ALIGN specified without /DRIVER; image may not run
game.obj : error LNK2001: unresolved external symbol __fltused
game.exe : fatal error LNK1120: 1 unresolved externals
Тогда какой компилятор необходимо использовать? Мне нужна поддержка ООП и чтобы без проблем подключался math.h с синусами, косинусами...
Значит, так.
1. Для компилятора GCC/G++ или Tiny C: библиотека menuetlibc включает в себя математическую библиотеку. Так что можно подключить math.h и спокойно пользоваться математическими функциями.
2. Для компилятора VC++/VS: kosSyst.h не включает реализации математических функций, так что в текущей реализации ими пользоваться нельзя. Проблема не в том, что нет math.h - его как раз-таки подключать можно без проблем, а в отсутствии реализации. Хотя можно попробовать подключить msvcrt.lib (в командной строке - дополнительный аргумент, в GUI есть специальный editbox для подключения объектников и библиотек) в надежде, что линкер не станет страдать фигнёй и подключит только math-библиотеку, которая вроде бы не опирается на WinAPI (зачем бы?). В данный момент сам проверить не могу, так что только советую попробовать.
3. Если строго следовать ANSI C, то реализация sqrt и прочих не может тупо вызывать соответствующие инструкции FPU, а должна иметь кучу обвязочного кода (исходники RTL в VS2005 входят, вроде бы там есть реализация). Всякие там errno, matherr...
Да, кстати, для компиляции вышеприведённого текста вполне достаточно объявить
1. Для компилятора GCC/G++ или Tiny C: библиотека menuetlibc включает в себя математическую библиотеку. Так что можно подключить math.h и спокойно пользоваться математическими функциями.
2. Для компилятора VC++/VS: kosSyst.h не включает реализации математических функций, так что в текущей реализации ими пользоваться нельзя. Проблема не в том, что нет math.h - его как раз-таки подключать можно без проблем, а в отсутствии реализации. Хотя можно попробовать подключить msvcrt.lib (в командной строке - дополнительный аргумент, в GUI есть специальный editbox для подключения объектников и библиотек) в надежде, что линкер не станет страдать фигнёй и подключит только math-библиотеку, которая вроде бы не опирается на WinAPI (зачем бы?). В данный момент сам проверить не могу, так что только советую попробовать.
3. Если строго следовать ANSI C, то реализация sqrt и прочих не может тупо вызывать соответствующие инструкции FPU, а должна иметь кучу обвязочного кода (исходники RTL в VS2005 входят, вроде бы там есть реализация). Всякие там errno, matherr...
Другой вопрос, что в абсолютном большинстве случаев это не нужно - нормальный программист либо вообще не извлекает корней из отрицательных чисел, либо явным образом проверяет на положительность перед использованием, так что тупой вызов FPU-команды вполне достаточен. Такие реализации можно написать за несколько минут, так что завтра могу выложить.NAME
sqrt - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
DESCRIPTION
The sqrt() function returns the non-negative square root
of x. It fails and sets errno to EDOM, if x is negative.
ERRORS
EDOM x is negative.
Да, кстати, для компиляции вышеприведённого текста вполне достаточно объявить
Code: Select all
extern "C" int _fltused;
int _fltused = 0;
Вот, что смог написать.. проверил - работает.
Остались две функции: арккосинус и округление.
Code: Select all
double sin(double x)
{
__asm fld x
__asm fsin
}
double cos(double x)
{
__asm fld x
__asm fcos
}
double sqrt(double x)
{
__asm fld x
__asm fsqrt
}
Думаю это поможет, тем кто захочет помочь:
, при
, при
, при
, при
Арксинус:
Арккосинус:fld x
fld st0
fmul st,st1
fld1
fsubrp st1,st0
fsqrt
fpatan
Округление до целого:fld x
fld st0
fmul st,st1
fld1
fsubrp st1,st0
fsqrt
fxch st1
fpatan
ЗЫ: за формулу респект, поправил калькуляторfld x
frndint
Last edited by Heavyiron on Thu Mar 01, 2007 2:03 am, edited 1 time in total.
Heavyiron
Code: Select all
double acos(double x)
{
__asm fld x
__asm fld st0
__asm fmul st,st1 // game.cpp(31) : error C2415: improper operand type
__asm fld1
__asm fsubrp st1,st0 // game.cpp(33) : error C2415: improper operand type
__asm fsqrt
__asm fstp st2
__asm fpatan
}
Попробуй вместо st вводить st(0), st1 - st(1)... Просто во всей литературе так, а когда писал функции для фасма он ругался на скобки. Кстати, я заменил fstp st2 в предпоследней строке на fxch st1 - так вроде оптимальней будет
Ура, заработало, спасибо.Heavyiron wrote:Попробуй вместо st вводить st(0), st1 - st(1)... Просто во всей литературе так, а когда писал функции для фасма он ругался на скобки. Кстати, я заменил fstp st2 в предпоследней строке на fxch st1 - так вроде оптимальней будет
И теперь последнее
Функция округления:
Code: Select all
int round(double x)
{
__asm fld x
__asm frndint
}
...
int fg = round(17.99);
Who is online
Users browsing this forum: Bing [Bot] and 35 guests