2 liczby int jako liczba double

0

Mam 2 liczby int, a = 3, b = 14. Chciałbym z nich zrobić jedną liczbę double = 3.14 - Jak to zrobić najprościej?

0

double.Parse( a + "." + b );

:P

Aha, ale chciałeś c++ :P

0

no w javie to banał ; D ale w C? chciałem najpierw na char* zamienić, potem na double, ale coś mi podpowiada, że da się prościej :P

0

Pisane z palca, ale będzie coś w rodzaju:
double = a+b/(10^(1+trunc(log10(b))))
Gdzie ^ oznacza do potęgi, a a oraz b są ofc.liczbami naturalnymi.

0

Na razie mam tak:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned long a = 3, b = 4;
    const int n = snprintf(NULL, 0, "%lu", b);
    const int m = snprintf(NULL, 0, "%lu", a);

    if(n < 0 || m < 0)
    {
        printf("error\n");
    }

    char *buf = (char*)malloc(sizeof(char) *(n+m+2));

    if(buf == NULL)
    {
        printf("error\n");
    }

    int c = snprintf(buf, n+m+2, "%lu", b);

    if(c <0)
    {
        printf("error\n");
    }

    c = snprintf(buf+n, n+m+2, "%c", '.');

    if(c<0)
    {
        printf("error\n");
    }

    c = snprintf(buf+n+1, n+m+2, "%lu", a);

    if(c<0)
    {
        printf("error\n");
    }

    buf[n+m+2] = '\0';

    double x = atof(buf);
    printf("%f\n", x);

    return 0;
}
0

A nie prościej będzie zapisać b do tego double-a, potem dzielić przez dziesięć (np w while-u) dopóki nie stanie się mniejsza od jedynki (w tym przypadku 2x coby uzyskać 0.14), i dodać a?

coś na kształt

 
#include <stdio.h>

int main()
{
    int a=3,b=14;
    double wynik=b;
    while (wynik >=1 ) wynik /=10;
    wynik += a;
    printf("%f",wynik);

    return 0;
}

0

@sig chyba chodzi o coś takiego

#include <stdio.h>
 
int main()
{
    int a=3,b=14;
    double wynik=b;
    while (wynik >=1 ) wynik /=100;
    if(wynik < 0.1) wynik *= 10;
    wynik += a;
    printf("%f",wynik);
 
    return 0;
}

wolniejsze będzie tylko jeśli b jest jednocyfrowe. Dla innych przykładów będzie równie szybkie lub szybsze.

0

Takie o, wzorujące się na pierwszym przykładzie ;)

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;

double IntsToDouble(int a, int b)
{
	char buf[64];
	sprintf(buf,"%d.%d",a,b);
	return atof(buf);
}

int main()
{
	int a=3,b=14;
	double c=IntsToDouble(a,b);
	cout << c;
	return 0;
}
1
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
  {
   int a=3,b=14;
   cout<<(a+pow(10,fmod(log10(b),1)-1))<<endl;  
   return 0;
  }
0

Po pierwsze, musisz się zastanowić jak dokładnie to ma działać.
Czy a=3 i b=1 to ma być 3.1 czy 3.01? Jeśli opcja pierwsza, to w jaki sposób chcesz uzyskać 3.01 (o ile w ogóle)? Jeśli druga, to sugeruje to stały dzielnik, po czym sytuacja staje się trywialna.

Przy wyborze opcji pierwszej, jeśli b może być nie większe niż ok. 1015 (na standardowych doublach x86), to możesz sobie obliczać je prostą funkcją

double f(long long v){
    return v*pow(10,-(floor(log10(v))+1));
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1