· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› число 0.0007f

<< . 1 . 2 .

Посл.отвђт Сообщен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, то в результате мы получем неопределенность бесконечность/бесконечность.
И что тебя удивляет?????

Предлагаю тебе написать это на асме, и тогда ты поймёшь почему!!!!!

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076