Vinnaren i pepparkakshustävlingen!
2021-11-13, 18:08
  #1
Medlem
Kod:
double doubleNumber;

double answer = doubleNumber % 1;

ERROR : answer must have ingrate or unscoped enum value?

Vad är fel?
__________________
Senast redigerad av bosscs2 2021-11-13 kl. 18:11.
Citera
2021-11-13, 19:33
  #2
Medlem
ingen som har samma funderingar en lördagskväll?
Citera
2021-11-13, 22:08
  #3
Moderator
Pontiac-Garages avatar
Det underlättar om du skriver vilket språk du kodar i.

Men gissar på C/C++. I så fall är svaret att procenttecknet representerar en kongruensberäkning, där du försöker att använda en variabel av typen double som operand (när du iställer behöver ett heltal). Eftersom kongruensberäkning enbart fokuserar på heltal (då du avser att räkna ut rest vid divisionsoperationer) kan du inte använda en sådan beräkning på värden av typen double.
Citera
2021-11-14, 10:35
  #4
Medlem
Goto10s avatar
Citat:
Ursprungligen postat av bosscs2
Kod:
double doubleNumber;

double answer = doubleNumber % 1;

ERROR : answer must have ingrate or unscoped enum value?

Vad är fel?

Modulusoperatorn (%) går inte att använda på flyttal (float eller double), bara på heltal.
För flyttal behöver du använda std::fmod. Se https://en.cppreference.com/w/cpp/numeric/math/fmod
Citera
2021-11-14, 12:10
  #5
Medlem
hogerspokets avatar
Citat:
Ursprungligen postat av bosscs2
Kod:
double doubleNumber;

double answer = doubleNumber % 1;

ERROR : answer must have ingrate or unscoped enum value?

Vad är fel?

Kod:
double doubleNumber;

int answer =  (int) doubleNumber % 1;

eller möjligen

Kod:
double doubleNumber;

int answer = ( (int) doubleNumber) % 1;
Citera
2021-11-14, 13:19
  #6
Medlem
Kod:
int answer = 0;
Modulo 1 är ju en tämligen meningslös operation.
Citera
2021-11-14, 15:27
  #7
Moderator
Neksnors avatar
Har rubrikens enums egentligen något med trådstarten att göra?
Citera
2021-11-14, 20:10
  #8
Medlem
hogerspokets avatar
Citat:
Ursprungligen postat av Neksnor
Har rubrikens enums egentligen något med trådstarten att göra?

Tveksamt. Verkar som TS tror att enum och int är utbytbara storheter. Men jag är inte helt säker.
Citera
2021-11-14, 23:07
  #9
Medlem
Använd fmod om du ska göra modulus på flyttal.
Citera
2021-11-19, 02:57
  #10
Medlem
Citat:
Ursprungligen postat av bosscs2
Kod:
double doubleNumber;

double answer = doubleNumber % 1;

ERROR : answer must have ingrate or unscoped enum value?

Vad är fel?


Ursäkta för detta svar, har det just nu inte aktuellt, eftersom jag inte kommer åt
någon del av C++ standarden på denna slöa uppkoppling här, så mitt minne är lite blurrigt:

Det står att answer måste vara deklarerad som en integer antar jag att kompilatorn menar.
Enum är typ en egen primitiv datatyp, och den ska definitionsmässigt vara uppräkningsbar.
En integer är uppräkningsbar, men det är inte en float (eller double).
Även om du har ett känt float number så vet du inte nästa float i serien,
alltså kan den inte bli uppräkningsbar.

I princip kan man ta reda på nästa float i serien men den beror på hur stor upplösning din float-typ har,
tex float eller double eller long double.

I vissa system och sammanhang kallas upplösningen ibland för epsilon, ibland för delta.
Olika numeriska bibliotek har olika definitioner på dessa.

Det menas dock att för floats generellt så kan de inte vara uppräkningsbara eftersom nästa värde i serien är infinitesimalt (oändligt) liten, och kan inte beräknas.

Och dvs för enums, alltså uppräkningsbara datatyper så ska operatorn > och < returnera en boolean, sant eller falskt, true or false.

Men det kan finnas äldre kod där man använder enums på andra sätt.
Tex för färger, tex röd, grön och blå.
Men tex uttrycket röd > grön saknar alltså mening. Därför är det principiellt fel att sätta en färg som en enum.
Gissningsvis finns det ändå gott om gammal kod där tex egenskapen färg är en enum.
Används den på rätt sätt så kan det väl fungera ändå.

Att använda modulus-operatorn % i något uttryck likt
% 1 ger väl alltid svaret noll 0, eftersom resten vid division med 1 alltid blir 0 som svar.
% 2 ger alltid 0, eller 1 som svar.
% 3 ger alltid 0, 1 eller 2 som svar.

Om jag nu minns rätt så kan även operatorn % overloadas, jag har dock lite svårt att se vitsen
för det, men för tex egna numeriska datatyper så kan den ju ha en tänkbar användning.

En primitiv datatyp har jag för mig är en datatyp som inte kan overloadas,
den kan inte omdefinieras.
I och för sig finns det säkert kod där tex integer omdefinierats till 128 bits integers,men det är inte normalt att göra det. Det rekommenderas istället att man skriver int128,mest för att när nya programmerare tex ska skolas in på ett nytt projekt
så är det viktigt att komma ihåg.
__________________
Senast redigerad av DrSvenne 2021-11-19 kl. 03:08.
Citera
2021-11-26, 22:34
  #11
Medlem
Citat:
Ursprungligen postat av Pontiac-Garage
Det underlättar om du skriver vilket språk du kodar i.

Men gissar på C/C++. I så fall är svaret att procenttecknet representerar en kongruensberäkning, där du försöker att använda en variabel av typen double som operand (när du iställer behöver ett heltal). Eftersom kongruensberäkning enbart fokuserar på heltal (då du avser att räkna ut rest vid divisionsoperationer) kan du inte använda en sådan beräkning på värden av typen double.

... och det var svaret på min fråga, case closed!
Citera

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