Как найти мантиссу десятичного числа?

Какие есть способы найти мантиссу числа? Кроме деления на 10 в цикле и десятичного логарифма.
Хотелось бы найти изящное и быстро работающее решение.
  • Вопрос задан
  • 4655 просмотров
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Здесь "изящное" и "быстроработающее" - слегка противоречивые требования. Быстрее всего будет определить число знаков делением пополам за 3-4 сравнения:
double mantissa(int c){
  int a=abs(c);
  int b=1;
  if(a>=100000){
    if(a>=10000000){
      if(a>=1000000000) b=1000000000;
      else if(a>=100000000) b=100000000;
      else a=10000000;
    }else if(a>=1000000) b=1000000;
    else b=100000;
  }else{
    if(a>=100){
      if(a>=10000) b=10000;
      else if(a>=1000) b=1000;
      else a=100;
    }else if(a>=10) b=10;
  }
  return (double)c/b;
}

но такой код трудно назвать красивым.
Лучше всего был бы цикл, но не с делением, а с целочисленным умножением на 10. Но там надо следить за переполнением.

Можно, конечно, и через float. Но там после вычисления порядка надо будет возвести 10 в нужную степень, а функция pow может оказаться для этого слишком долгой.

double mantissa(int a){
	if(a==0) return 0;
	float f=a;
	int b=((*(int*)&f&0x7fffffff)-0x40cd3ed7)/0x019a7daf;
	double d=a*pow(0.1,b);
	if(fabs(d)>=10) d/=10;
	return d;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
begemot_sun
@begemot_sun
Программист в душе.
Число float или double ?

Видимо вам необходимо почитать: en.wikipedia.org/wiki/IEEE_floating_point#Basic_formats
и исходя из двоичного формата вашего типа найти нужную вам мантису самостоятельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы