|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 6, 2003 00:47:16 Fixer Найти бы систему счисления в которой бы число ПИ представлялось в виде конечного ряда цифр Можно взять Pi в качестве радикса: Pi, 2Pi, 3Pi, ... :))) |
|
|
Дата: Авг 6, 2003 02:57:10 Fixer Привет, брат ;) Привет :) Просто о проблемах представимости нужно знать и все. А выбор уже зависит от задачи. |
|
|
Дата: Авг 6, 2003 16:26:48 Fixer ЗЫ Найти бы систему счисления в которой бы число ПИ представлялось в виде конечного ряда цифр. Привет, такая система давно существует :))) И называется это числом PI :))) |
|
|
Дата: Авг 6, 2003 16:31:34 А теперь мой вопрос. The Svin его уже знает. Итак. Есть у нас с Вами 64 бита мантиссы... Есть две функции 1. Переводит строку 0.xxxxxxx -> FLOAT10 (или 10 -> 2) 2. Переводит FLOAT10 -> строку Вот она наша дорогая мантисса... Задание. Нужно обосновать (что главное) Как ПРАВИЛЬНО построить эти процедуры. Это значит, что: 1. Они должны быть взаимообратны FLOAT -> STRING ~ STRING -> FLOAT 2. С точки зрения математики (тут сложнее) После математических операций, результат должен быть такой, какой он был бы в 10 системе исчисления Вот вам и дессиртация :)) |
|
|
Дата: Авг 6, 2003 20:14:43 Edmond =8-0 Я в начале темы чего-то пытался мистифицировать, но ты поднял Загадку на небывалую высоту. Или в духе С.Кинга "...стали пропадать люди, они дочитывали тему до конца и ...". Тут и подводные чеховские течения ;) и легкая софистика ;) |
|
|
Дата: Авг 6, 2003 20:54:17 xzazet А зря вы смеётесь!!! Это ещё та проблема!!! И никакая она не мифическая, а очень даже математическая!!! |
|
|
Дата: Авг 7, 2003 04:01:27 [offtop] Edmond Вот в следующий раз я буду ставить смайликов побольше :)))) |
|
|
Дата: Авг 7, 2003 09:57:29 Edmond 1. Они должны быть взаимообратны FLOAT -> STRING ~ STRING -> FLOAT Лучше так STRING -> FLOAT ~ FLOAT -> STRING 8) У меня при преобразовании lond double в строку терялось 4 последних знака, из-за того что пытался порядок через всякие логарифмы на сопроцессоре считать. Кстати неплохая задачка для компо: написать программу, которая файл со строками, переводит в файл с float'ами. Затем тестовая программа вычисляет некоторые выражения от этих чисел, сравнивет с тем, что должно быть и суммирует все ошибки. У кого суммарная ошибка наименьшая, тот и чемпион. |
|
|
Дата: Авг 7, 2003 14:22:41 Не в тему, но все-таки. Кто нибудь может помочь новичку? Нужно описание представления чисел в FPU (IEEE754), ссылки, посты все что угодно. Второе, хочу задействовать xmm регистры, код такой: .686p .model flat, stdcall option casemap:none include kernel32.inc .code _start: pop eax mov xmm1, eax xor eax, eax call _imp__ExitProcess@4 end _start Просто тестер. Компилирую, версия ml 6.14.8078, командная строка /c /coff /Cp, выдает что "xmm1" неопределенные символы. |
|
|
Дата: Авг 7, 2003 14:31:51 Попробуй xmm(1) |
|
|
Дата: Авг 7, 2003 16:22:00 ferty Еще попробуй .SSE, movups xmm1,[ebx] , или, если не поможет, попробуй использовать fasm. Edmond А задача не такая простая как мне показалось на первый взгляд. Если отвлечься от ограничений на величину числа, то алгоритм можно представить следующим образом:
float stringtofloat(char* s)
{
verylongint result=0; //результат
sign=plus; //знак числа
int ppoint=0; //позиция точки()
int n=0; //порядок числа
psign=plus; //знак порядка
verylongint p=1; //10^n
//сохраним знак числа
if(*s=='-')
sign=minus;
else if(*s=='+')
s++;
//вычисляем мантисту
while(*s>='0'&&*s<='9')
{
result=result*10+*s-'0';
s++;
}
if(*s=='.')
{
s++;
//продолжаем вычислять мантисту
while(*s>='0'&&*s<='9')
{
result=result*10+*s-'0';//с каждой итерацией
//масштабируем мантисту в 10 раз
s++;
point--;//поэтому потом умножим ее на 10^ppoint
}
}
//если у числа есть порядок то вычислим и его
if(*s=='e'||*s=='E')
{
s++;
if(*s=='-')
psign=-1;
else if(*s=='+')
s++;
while(*s>='0'&&*s<='9')
{
n=n*10+*s-'0';
s++;
}
}
if(psign=minus)
n=-n; //теперь у нас есть порядок числа
n+=ppoint;//учтем то, что мантиста промасштабированна
//сохраним знак порядка и вычислим его абсолютную величину,
//чтобы не делать лишних делений
if(n>=0)
psign=plus;
else
{
psign=minus;
n=-n;
}
//вычисление 10^n
for(int i=0;i<n;i++)
p*=10;
//учитываем знак нашего числа
if(sign=minus)
result=-result;
//получаем наше число c минимальной погрешностью
//ошибка возникает из-за преобразования verylongint во float
//и относительная погрешность составляет 2^-(разрядность мантисты)
if(psign>0)
return result*p;
else
return result/p; //если мы преобразуем result и p во float
//перед делением, а не будем честно вычислять его,
//то ошибка увеличится
}
Если заменить verylongint, на реальный float (maxfloat=1E37), то в данном алгоритме наблюдается интересный баг. Например, если число 1000000 записать как 1{50 нулей}E-44, то в результате мы получем неопределенность бесконечность/бесконечность. 162004517__ |
|
|
Дата: Авг 7, 2003 16:26:37 Ничего присоединять я не хотел, это туда просто пробел случайно попал, может стоит проверку на имя из пробелов ввести? |
|
|
Дата: Авг 7, 2003 20:16:25 · Поправил: Edmond Black_mirror Тоды чемпион я :)))) У меня другая задачка.. Но сперва я напишу свой код, а потому буду вам голову морочить :) А задача не такая простая как мне показалось на первый взгляд. Если отвлечься от ограничений на величину числа, то алгоритм можно представить следующим образом: Хехехеее. Ты думаешь, я сижу над простыми задачами неделю? Над этой я перерыл пол проца, чуть до ML не добрался (то есть до дизаасемблирования) Но пока отошло... |
|
|
Дата: Авг 7, 2003 20:24:49 Black_mirror 1000000 записать как 1{50 нулей}E-44, то в результате мы получем неопределенность бесконечность/бесконечность. И что тебя удивляет????? Предлагаю тебе написать это на асме, и тогда ты поймёшь почему!!!!! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |