Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #31431

Dokładny podział integera na k jednakowych integerów

From Borneq <borneq@antyspam.hidden.pl>
Newsgroups pl.comp.programming
Subject Dokładny podział integera na k jednakowych integerów
Date 2018-01-30 18:39 +0100
Organization ATMAN - ATM S.A.
Message-ID <p4qakp$82b$1@node2.news.atman.pl> (permalink)

Show all headers | View raw


To coś co ma wiele wspólnego przy powiększaniu rastra metodą Nearest 
przy niecałkowitym powiększeniu.

Metoda naiwna:
void divide_float(int n, int k)
{
	double interval = double(n)/k;
	//double
	for (int i=0; i<k; i++)
	{
		printf("%d %f %f\n",i,i*interval, (i+1)*interval);
	}
}

chcę działać na integerach ale i tak mam kłopot z zaokrągleniami:
void divide_int(int n, int k)
{
	double interval = double(n)/k;
	//int
	uint32_t intPartPos, fracPartPos;
	uint32_t intPartDelta,fracPartDelta,oldFrac;
	intPartPos = 0; fracPartPos = 0;
	intPartDelta = floor(interval);
	fracPartDelta = floor((interval - intPartDelta) * 65536 * 65536);
	for (int i = 0; i<k; i++)
	{
		intPartPos += intPartDelta;
		oldFrac = fracPartPos;
		fracPartPos += fracPartDelta;
		if (oldFrac > fracPartPos) // when LongWord overflow
			intPartPos++;
		printf("%d %d\n", i, intPartPos);
	}
}

divide(10, 3) zwraca 3,6,9 zamiast 3,6,10 dlatego że w ostatnim jest 
błąd rzędu 2^-32 i to wystarczy by było źle.

Back to pl.comp.programming | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

Dokładny podział integera na k jednakowych integerów Borneq <borneq@antyspam.hidden.pl> - 2018-01-30 18:39 +0100
  Re: Dokładny podział integera na k jednakowych integerów Borneq <borneq@antyspam.hidden.pl> - 2018-01-30 18:54 +0100
    Re: Dokładny podział integera na k jednakowych integerów Borneq <borneq@antyspam.hidden.pl> - 2018-01-30 18:56 +0100
      Re: Dokładny podział integera na k jednakowych integerów Borneq <borneq@antyspam.hidden.pl> - 2018-01-30 19:35 +0100

csiph-web