I wrote a program to solve y = a^x
and then project it on a graph. The problem is that whenever a < 1
I get the error:
ValueError: invalid literal for int () with base 10.
Any suggestions?
Here's the traceback:
Traceback (most recent call last): File "C:\Users\kasutaja\Desktop\EksponentfunktsioonTEST - koopia.py", line 13, in <module> if int(a) < 0: ValueError: invalid literal for int() with base 10: '0.3'
The problem arises every time I put a number that is smaller than one, but larger than 0. For this example it was 0.3 .
This is my code:
# y = a^x import time import math import sys import os import subprocess import matplotlib.pyplot as plt print ("y = a^x") print ("") a = input ("Enter 'a' ") print ("") if int(a) < 0: print ("'a' is negative, no solution") elif int(a) == 1: print ("'a' is equal with 1, no solution") else: fig = plt.figure () x = [-2,-1.75,-1.5,-1.25,-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1,1.25,1.5,1.75,2] y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25), int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25), int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75), int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)] ax = fig.add_subplot(1,1,1) ax.set_title('y = a**x') ax.plot(x,y) ax.spines['left'].set_position('zero') ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') ax.spines['left'].set_smart_bounds(True) ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') plt.savefig("graph.png") subprocess.Popen('explorer "C:\\Users\\kasutaja\\desktop\\graph.png"') def restart_program(): python = sys.executable os.execl(python, python, * sys.argv) if __name__ == "__main__": answer = input("Restart program? ") if answer.strip() in "YES yes Yes y Y".split(): restart_program() else: os.remove("C:\\Users\\kasutaja\\desktop\\graph.png")
ValueError: invalid literal for int() with base 10 occurs when you convert the string or decimal or characters values not formatted as an integer. To solve the error, you can use the float() method to convert entered decimal input and then use the int() method to convert your number to an integer.
invalid literal for int() with base 10. The error message invalid literal for int() with base 10 would seem to indicate that you are passing a string that's not an integer to the int() function . In other words it's either empty, or has a character in it other than a digit.
To convert a string to integer in Python, use the int() function. This function takes two parameters: the initial string and the optional base to represent the data. Use the syntax print(int("STR")) to return the str as an int , or integer.
Your traceback is telling you that int()
takes integers, you are trying to give a decimal, so you need to use float()
:
a = float(a)
This should work as expected:
>>> int(input("Type a number: ")) Type a number: 0.3 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '0.3' >>> float(input("Type a number: ")) Type a number: 0.3 0.3
Computers store numbers in a variety of different ways. Python has two main ones. Integers, which store whole numbers (ℤ), and floating point numbers, which store real numbers (ℝ). You need to use the right one based on what you require.
(As a note, Python is pretty good at abstracting this away from you, most other language also have double precision floating point numbers, for instance, but you don't need to worry about that. Since 3.0, Python will also automatically convert integers to floats if you divide them, so it's actually very easy to work with.)
Your problem is that whatever you are typing is can't be converted into a number. This could be caused by a lot of things, for example:
>>> int(input("Type a number: ")) Type a number: -1 -1 >>> int(input("Type a number: ")) Type a number: - 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '- 1'
Adding a space between the -
and 1
will cause the string not to be parsed correctly into a number. This is, of course, just an example, and you will have to tell us what input you are giving for us to be able to say for sure what the issue is.
y = [int(a)**(-2),int(a)**(-1.75),int(a)**(-1.5),int(a)**(-1.25), int(a)**(-1),int(a)**(-0.75),int(a)**(-0.5),int(a)**(-0.25), int(a)**(0),int(a)**(0.25),int(a)**(0.5),int(a)**(0.75), int(a)**1,int(a)**(1.25),int(a)**(1.5),int(a)**(1.75), int(a)**(2)]
This is an example of a really bad coding habit. Where you are copying something again and again something is wrong. Firstly, you use int(a)
a ton of times, wherever you do this, you should instead assign the value to a variable, and use that instead, avoiding typing (and forcing the computer to calculate) the value again and again:
a = int(a)
In this example I assign the value back to a
, overwriting the old value with the new one we want to use.
y = [a**i for i in x]
This code produces the same result as the monster above, without the masses of writing out the same thing again and again. It's a simple list comprehension. This also means that if you edit x
, you don't need to do anything to y
, it will naturally update to suit.
Also note that PEP-8, the Python style guide, suggests strongly that you don't leave spaces between an identifier and the brackets when making a function call.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With