18 svar
585 visningar
villsovaa behöver inte mer hjälp
villsovaa 925
Postad: 2 maj 2021 12:58 Redigerad: 2 maj 2021 12:59

Ekvation på python

Hej, har en fråga som jag skulle vilja lösa på python men det går inte bra. Jag vill få fram alla heltalsvärden på n som uppfylls av ekvationen. Så här ser min kod ut:

Men förstår inte varför det blir fel? Skrev for n in range (1,1000) för att jag trodde att det inte skulle gå annars. Men jag vill ha fram alla godtyckliga heltalsvärden. Funkar ändå inte. 

Smutstvätt 25078 – Moderator
Postad: 2 maj 2021 13:17

Det fattas väl någon likhet i if-satsen? Just nu står det väl i princip "if UTTRYCK, skriv ut"? Vad ska uttrycket uppfylla? :)

Laguna Online 30484
Postad: 2 maj 2021 13:38

Dessutom ska det finnas ett kolon i slutet på raden med 'if', och det fattas också en parentes, så det blir troligen syntaxfel.

villsovaa 925
Postad: 2 maj 2021 13:50
Smutstvätt skrev:

Det fattas väl någon likhet i if-satsen? Just nu står det väl i princip "if UTTRYCK, skriv ut"? Vad ska uttrycket uppfylla? :)

Jahaaaa! Men i så fall kanske det är dumt att använda en if-sats? Jag vill ju bara att ekvationen ska skriva ut alla heltal n som uppfyller villkoret. Men om jag tar bort "if" så blir det ändå fel? Läser inte programmering så detta är mer som en slags gissningslek vilket kanske inte är så bra...

Smutstvätt 25078 – Moderator
Postad: 2 maj 2021 14:20

Nejdå, en if-sats är bra, men du måste ha ett villkor att uppfylla. Är det exempelvis att bråket ska vara ett heltal? 

villsovaa 925
Postad: 2 maj 2021 14:23
Smutstvätt skrev:

Nejdå, en if-sats är bra, men du måste ha ett villkor att uppfylla. Är det exempelvis att bråket ska vara ett heltal? 

Ja! Hur skrivs det?

Smutstvätt 25078 – Moderator
Postad: 2 maj 2021 14:26
quote = BRÅKET

isinstance(quote, int)

borde fungera. :)

villsovaa 925
Postad: 2 maj 2021 14:34
Smutstvätt skrev:
quote = BRÅKET

isinstance(quote, int)

borde fungera. :)

Tack för hjälpen!!

Smutstvätt 25078 – Moderator
Postad: 2 maj 2021 14:37

Varsågod! :)

Laguna Online 30484
Postad: 2 maj 2021 14:42

Jag misstänker att kvoten alltid är ett flyttal, även om det matematiskt är ett heltal, t. ex. 3.14/1.57 = 2.0.

villsovaa 925
Postad: 2 maj 2021 14:44
Laguna skrev:

Jag misstänker att kvoten alltid är ett flyttal, även om det matematiskt är ett heltal, t. ex. 3.14/1.57 = 2.0.

Hej! Jag förstår inte riktigt vad du menar nu!

Laguna Online 30484
Postad: 2 maj 2021 14:49

Det betyder att isinstance(quote, int) alltid är falskt. Men prova och se hur det går. 

villsovaa 925
Postad: 2 maj 2021 14:53
Laguna skrev:

Det betyder att isinstance(quote, int) alltid är falskt. Men prova och se hur det går. 

Jo du har nog rätt, alla tal mellan 1 till 1000 printades:

Men vad kan man skriva istället då?

Smutstvätt 25078 – Moderator
Postad: 2 maj 2021 14:55

Nu testar du inte att uttrycket är ett heltal. Lägg in isinstance-uttrycket i din if-sats, så att du testar utifrån det. Men Laguna kan ha rätt att det kan bli problem ändå. Prova! :)

villsovaa 925
Postad: 2 maj 2021 15:00
Smutstvätt skrev:

Nu testar du inte att uttrycket är ett heltal. Lägg in isinstance-uttrycket i din if-sats, så att du testar utifrån det. Men Laguna kan ha rätt att det kan bli problem ändå. Prova! :)

Ok, nu ser det ut så här:

Men jag trodde att isinstance-uttrycket skulle var svaret på if-satsen. Men vad ska man lägga in som svar där nu istället? För det här ovan printar ingenting.

Fermatrix 7841 – Fd. Medlem
Postad: 3 maj 2021 01:20 Redigerad: 3 maj 2021 01:27

Prova något i denna stilen.

import math
for n in range (1,1000):
    if(((12-math.sqrt(n))/(4-math.sqrt(7))).is_integer()):
        print(n)
Laguna Online 30484
Postad: 3 maj 2021 10:23
Dracaena skrev:

Prova något i denna stilen.

import math
for n in range (1,1000):
    if(((12-math.sqrt(n))/(4-math.sqrt(7))).is_integer()):
        print(n)

Den lösningen verkar fungera i den här uppgiften, men man kan få problem i andra situationer med flyttal som borde vara heltal men bara nästan är det. T.ex. det här, som borde bli exakt 11: ((1+sqrt(5))/2)**4 + ((1-sqrt(5))/2)**4. Det blir 11.000000000000002 med motsvarande Python-uttryck, och därmed är is_integer falsk.

Smutstvätt 25078 – Moderator
Postad: 3 maj 2021 11:30

Ett alternativ för att bli av med problemet med flyttal är följande: 

if (abs(variabel - round(variabel)) < LITET VÄRDE:
	print(variabel)

Med valfri storlek på LITET VÄRDE, men något värde nära noll, typ 0,00001. 

Detta gör att vi kringgår flyttalsfel, och slipper problemet som Laguna nämnde med int-typen. :)

Det borde gå att använda .ceil() eller .floor() också, men det är nog lättare att det blir knas. 

villsovaa 925
Postad: 3 maj 2021 19:05
Dracaena skrev:

Prova något i denna stilen.

import math
for n in range (1,1000):
    if(((12-math.sqrt(n))/(4-math.sqrt(7))).is_integer()):
        print(n)

Fick rätt när jag gjorde detta, stort tack för hjälpen alla!

Svara
Close