Vinnaren i pepparkakshustävlingen!
  • 2
  • 3
2018-03-10, 19:18
  #25
Medlem
MeanMEs avatar
Citat:
Ursprungligen postat av RostigHink
Nu tycker jag du är i petigaste laget. Trunkering när heltal exempelvis wrappar kan man inte kalla avrundningsfel.
Jo visst är det ett typ av avrundningsfel som man medvetet i bästa fall byggt in.
Tar du 7 / 3 och alla variabler är av typen int får du ju inbyggt avrundningsfel imho.
Det är ju den typen av problematik du springer på hela tiden.

Och ser man på hur AIn bedömer ställningar och redovisar dem numeriskt så har de en upplösning på 4 positioner, nn.nn i t.ex Stockfish.

Så har man en upplösning ner till 1/100 så ger inte heltalsaritmetik bra värden att jobba med, med mindre än att man skalar värdena säg en 10.000 så det är vad en bonde är värd. Då har du ju ett överhäng på två värdesiffror som gör att man neutraliserar de mesta av de negativa effekterna av att bruka int och man kan komma undan med det hela.

Det finns som sagt många sätt att flå en katt.
Citera
2018-03-11, 11:19
  #26
Medlem
Citat:
Ursprungligen postat av MeanME
Tar du 7 / 3 och alla variabler är av typen int får du ju inbyggt avrundningsfel imho.
Det är ju den typen av problematik du springer på hela tiden.
Rent formellt skiljer man på avrundningsfel och diskretiseringsfel. Ett avrundningsfel uppstår på grund av begränsad noggrannhet i beräkningarna medan diskretiseringsfel uppstår därför att svaret inte kan lagras exakt i den angivna representationen.

Diskretiseringsfelet är alltså oundvikligt till sin natur medan avrundningsfelet kan bli olika stort beroende på i vilken ordning olika delsteg i beräkningen faktiskt utförs.

Det som är relevant för kompilatorns möjlighet att optimera koden är att många heltalsoperationer inte är ordningsberoende medan de flesta flyttalsoperationer är det.
Citera
2018-03-11, 12:52
  #27
Medlem
Lättare att förklara med exempelkod:
Kod:
t.c:
  int f(T x) {
    T y = x;
    y += 1;
    y -= 1;
    return x <= y;
  }
Enligt den analytiska matematiken skall x och y ha samma värde och f(x) skall vara sant för alla x. Om T är en flyttalstyp så kan dock y få ett avrundningsfel till följd av kancellering. Kompilatorn får inte lov att optimera bort de till synes onödiga beräkningarna därför att det skulle påverka resultatet av programmet om x har ett litet positivt värde:
Kod:
$ gcc -DT=float -O3 -S -o - t.c:
f:
.LFB0:
	.cfi_startproc
	movaps	%xmm0, %xmm1
	xorl	%eax, %eax
	movss	.LC0(%rip), %xmm2
	addss	%xmm2, %xmm1
	subss	%xmm2, %xmm1
	ucomiss	%xmm0, %xmm1
	setnb	%al
	ret
	.cfi_endproc
Däremot kan heltalsberäkningar inte ge upphov till motsvarande avrundningsfel, med följd att kompilatorn kan reducera bort samtliga beräkningar och hårdkoda f(x) till att returnera sant:
Kod:
$ gcc -DT=int -O3 -S -o - t.c:
f:
.LFB0:
	.cfi_startproc
	movl	$1, %eax
	ret
	.cfi_endproc
Citera
  • 2
  • 3

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback