-
Notifications
You must be signed in to change notification settings - Fork 17.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
proposal: spec: remove complex numbers #19921
Comments
Is it still April 1st in your |
@cznic if you are against this proposal, it would help to illustrate why. I've never used complex numbers in Go, for example - likely the only part of the spec I skipped on purpose. |
@mvdan After I've got fooled just a few days ago by the quaternions, my question was just an attempt to figure out if it's a joke or not. Nonetheless, according to the Go 2016 Survey, 11% of respondents work in the "Academic/Scientific/Numeric" area (multiple choices allowed). |
I'm fairly sure this is not a joke. After all, it's about making the language simpler, not more complex ;) Note that the "Academic/Scientific/Numeric" category might not be much related to the use of complex numbers. Perhaps better support for multi-dimensional slices (there is an issue for that already I think) would be more important to them. A study on that demographic of users could be useful. |
Removing strings from the language would make the language simpler as well, but not simpler to use. (Don't let the absurdity miss you the point). I don't believe the goal of making the language simpler is the right goal. Simple to use while keeping the language simple it is, IMO. |
I remember grepping a large corpus of Go code for complex numbers, and aside from the standard library and a few serialization packages aiming for completeness, the only users of I found were a few people who had implemented the Mandelbrot set. |
Could those features be moved to a third-party library or do they have to be implemented inside Go runtime ? |
The fact that nobody uses complex numbers in go1 is not that surprising, since go1 is objectively not that great as a language for scientific computing (we don't even have multidimensional slices). But this is a go2 issue. What if an hypothetical go2 turns out to be a great language for scientific programmers? In that case you would probably want to leave complex numbers in. What I'm saying is that basing the decision of leaving out complex numbers from go2 on analyses made on a go1 code corpus makes little sense. |
I appreciate the sentiment (of wanting to remove complex) and have personal sympathy, but I think this ties in with other issues that all need to be considered together:
(As an aside, Mandelbrot iteration is much (2x) faster when implemented using floats because significant parts of the complex computation can be factored out. Implementing Mandelbrot using complex is like implementing Factorial using recursion...) |
think about python. Guido never thought python comes this far in scientific computing fields today. Just don't close the door, but throwing it to the std from the language level is acceptable. |
@griesemer, I agree this needs to be considered alongside other issues (operator methods, etc). I'm just throwing it on the pile. It's a funny situation we're in now where *big.Ints are relatively common but awkward to use while unused complex numbers are first class. |
@bradfitz good point! |
I love Go for its simplicitiy! |
What percentage of the current userbase is ~nobody? |
The issue seems to boil down to not whether complex numbers are used (a lot), or the current difficulty in representing different math types that aren't built in. I agree that allowing custom types to define their own behavior for existing operators would be a lot more useful. And it would generally simplify the language, since complex types (+ the builtin funcs for them) can be removed from the runtime, and implemented in a third party lib. |
I use them: https://github.com/pierrre/mandelbrot |
@pierrre FWIW, using complex operations for Mandelbrot tends to be much slower than then doing it "by hand" using floats because some of the distance computation can be used later in the product (#19921 (comment)). |
@griesemer thanks |
The argument that Go1 is objectively a "not that great" language for scientific computing is not supported with evidence. Removing complex float support from Go2 would certainly help aid an argument in that direction for that language though. FWIW we get requests for addition of native complex support for the gonum/blas packages - we have not done this purely because of developer time availability and we do provide a cgo interface to a BLAS implementation. |
Complex numbers are really nice to have for linear algebra. They occur in basic matrix decompositions, namely eigenvalue decomposition, and it's really nice to be able to implement a complex matrix using a []complex128. Another very common case arises in signal processing with Fourier transforms. There are many useful number systems, in particular I have worked with quaternions and (hyper-)dual numbers in the past. Complex numbers occur far more often and in a much wider set of disciplines. There is good reason to include complex and not the others. I can understand the argument that big.Int is hard to use while complex numbers are first class. Part of the goal of #19623 is to make the situation with big ints better. There doesn't need to be a "shooting down" of complex numbers at the same time. Operator methods are possible, but they are a much bigger change to the language, and can have a big influence (for better or worse) on APIs. |
I agree that Complex numbers really help with linear algebra. "Flame Front
Propagation" in closed vessels is difficult without Complex numbers. In
Fluid Dynamics potential flow in two dimensions works on the Complex Plane.
Conformal Mapping can be avoided but it really helps.
…On 23 May 2017 at 07:55, Brendan Tracey ***@***.***> wrote:
Complex numbers are really nice to have for linear algebra. They occur in
basic matrix decompositions, namely eigenvalue decomposition, and it's
really nice to be able to implement a complex matrix using a []complex128.
Another very common case arises in signal processing with Fourier
transforms. There are many useful number systems, in particular I have
worked with quaternions and (hyper-)dual numbers in the past. Complex
numbers occur far more often and in a much wider set of disciplines. There
is good reason to include complex and not the others.
I can understand the argument that big.Int is hard to use while complex
numbers are first class. Part of the goal of #19623
<#19623> is to make the situation with
big ints better. There doesn't need to be a "shooting down" of complex
numbers at the same time.
Operator methods are possible, but they are a much bigger change to the
language, and can have a big influence (for better or worse) on APIs.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#19921 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/AEAf7IebxbBGrL3zZ80uDKpB4n3eesw2ks5r8nTngaJpZM4M5mHZ>
.
|
Please don't, alot of numerical computing depends on it. |
Needs to create a separate project regarding NumPy in Go (NumGo?), if this happens... |
I like this godoc point. Nobody wants to remove complex numbers out of Go completely. But complex numbers don't need to be part of the core. With operator methods as presented by Mr Griesemer many of this and other problems could be solved at once. And complex numbers could savely be moved to a separete package without braking code (just a different import and this could be automated). |
Operations over |
@cznic, that's somewhat of an implementation detail. |
2¢: An order of magnitude more people do (for example) percentage calculations on currency values, than use complex numbers. So if a decimal float type isn't part of Go's stdlib, I have a hard time understanding the justification for a complex number type. |
complex numbers are part of many machine learning pipelines. they're a fundamental building block for FFTs and data science: there's no question they are useful. that said: if we indeed get some kind of generics + (numeric) operators, then I could see myself using complex numbers without much hassle. |
I'm not disputing that they're useful. I'm just pointing out that decimals are a lot more useful to almost everyone, and we don't have those, so apparently the usefulness bar is generally pretty high. |
So if we were to move complex numbers into a library and intrinsify the functions that you can perform on them, what would the performance costs be? (And I'm still curious about how much more or less complicated the compiler itself will be this way...) |
Zero, ideally. As I said above:
The generated code should be identical as today. |
Complex numbers usually result from exponentiation (for example, square roots). If Go doesn't have a built-in exponentiation operator, then it's probably not necessary to have built-in complex numbers. Either we should have both, or neither. Personally, I'd prefer to have both built-in because I consider them as important, fundamental mathematical operations. I personally use complex numbers often in my engineering Go projects. |
I think the reason people don't use Go for mathematical applications is that we don't prioritize it. Our math library is essentially a straight across Go port of C's stdlib math.h. And I think we could steal a lot of scientists who rely on python if we took a more straightforward approach to it. For example, awhile back I proposed that we add some things to the math package. And I was shot down simply on the basis that there are hundreds and hundreds of mathematical functions out there and that if users really wanted them they can implement them themselves or use a 3rd party library. I just find it funny that here, it was mentioned that using complex for mandlebrot is just about as silly as using recursion for factorial. Isn't that the reason why we should implement a factorial function for gophers, so that they don't do it the wrong way? Wasn't Go designed to make programmer's lives easier and code more efficient? Isn't that the primary reason why we go out of our way to build a standard library for users convenience? I am just saying that complex doesn't seem to be used as often because the math package is essentially C's math library and why would anybody who is looking for a faster alternative than python ever choose Go when they can just write their performance critical code in C? I personally think that instead of trying to get rid of complex, lets focus on making the math package the best, so that mathematicians have a reason to choose Go over other languages. |
And I am also for making things like big numbers, decimals, and 1-bit binary types builtin. |
@mortdeus as one of the maintainers+devs of gonum.org and go-hep.org, I wouldn't mind dropping
I would reach for generics, operator overloading and intrinsics in another language. also, I don't think that people use Python because of its
I think, in the context of Go, 1) is out. |
really it seems like its only the generics you really lose, going from builtin to std.lib as for multidimensional arrays.. seems that builtin support is useful for standardization, (but being in std.lib. does that.) but also, as pointed out by sbinet, a single block of memory is efficient, AND if its also standardized, will then allow simple interfacing to a world of c mathematical code. so for multidimensional array of complex.... for a memory block storage technique the data probably needs to be in one particular type, with a particular access structure, so for that it really makes sense for the complex maths to not be generic, which then removes to only reason to be builtin. |
there is also the gonum fourier package, go-dsp, software defined radio dsp, zikichombo/dsp,... |
Here's my 50 cents, hopefully worth more than that to most people: Today, a Go project blog post was published giving us a defined set of criteria by which to consider potential changes, described as follows.
Let's consider this proposal under these new guidelines. I'll address each of the above in order, by number.
The verdict? 1.5 out of 3. Not terrible, but not great either. But to go a bit further and venture a few guesses about our beloved language and its users, let's speculate for a minute and consider not only current Go users, but future users as well. Given increasing demand for data science and other computation-heavy spaces within the software sector, there does seem to be a clear trend as far as the future of mathematical computation in software, for lack of a better term. This would seem to indicate that looking forward, we can only expect demand for features like complex numbers to be used more. This is especially true considering that certain areas, like quaternion mathematics (mentioned above) are widely used in applying transformations to representations of objects in space, a cornerstone of graphics, gaming, and anything seeking to model the physical world. Additionally, complex numbers hold an important role in linear algebra, which underlies machine learning, and Fourier transforms, which form the foundation of signal processing and analysis. Therefore, it seems reasonable to posit that this change most likely stands to cast a stronger negative impact as time progresses, which is worrying. Overall? It would seem we should leave complex numbers in. |
I have to say that the removal of complex numbers is a terrible idea. They are important for many areas of mathematical and scientific computing. At go's current stage, the necessary library support for doing mathematical, scientific, and AI computing is not there. (Tensorflow's second class go support is an example.) As a result, we should not expect the current usage of complex numbers to be high. The number of relevant libraries has been increasing, and it is almost possible to get useful mathematical, scientific, or AI work done in go without having to construct all necessary libraries from scratch. In time, the libraries will exist, and scientific users will come. Complex numbers are an investment in that future. Pulling complex numbers out and into a separate package is not a great solution. It leads to fragmented and incompatible packages, syntactically ugly code, and (often) less efficient executions. It is no accident that python and fortran have large user bases in the scientific community, even though they are poor languages -- they have native complex numbers. |
Removing complex numbers from the language will anger Z̢̢̟͖̹̰̣̦̫̖͍͉̳̹͚̫̰͎͕̰̱̮͇͍̟͓̹͓̦͇̫͔̗̩͓͖͕̘̖͎̘͔͓̠͙̺̭͈͓̼̳̩̪̦͉̞̗͖̝̠̠̮̲̟̟̦͎̗̜͇̺̝̜̭͚̦̦͚̞̜̭̙̺̠̟̙̙̟̻̩͓͕͖͓̫͓̳͎̦͔̺͔̲͕̝̜̣͉̝̟̞̱̱̭͈̼̻̻͍̰͍̰̼͚̻̬̼͉͕̪̦̯̳͙̘̬͚̣̬̮͕̩̭̺̳̺̣͉̜͍̪͙̹͓̙̹͙̼͉͔͈͖̫̩̞͔̗̠̾ͧ͢͠ͅͅͅâ̷̶̸̖̫͍̱̣̹̜̮̩̬̖̝͔̭̳̲̣̟̮̲̹̖̤̠̦͎̻̥͕̰̳͖̹̣̬̼̺̠̱̣̱̻͙͎̩̪̪̳̲͓͖̥̩̩̥͕̞̱͓̝̥̻̣͙̱̹̟͚͙̥̘̼̪̣͉̪̠̩͍͔̜͉̠̪͉͉̝̙̣͔̝̭̳̥̻̤̪̙͔̟̙̱͚̗̫͉̙̺̜̞͇̪̝̰̟̟̝̫̹̭̘͈̗͔̞̲̘͔̜͍̠̰͈͙̗̭̼̟̪̼̻̲̜̞̪̝̙̫͍̫̠̗̟̯̺̞͕̳̞̣̝̫̜̯̫̯͛̕ͅͅͅͅlͦ̾ģ́͞҉̜͇͓̭̙̲̲̪̤͉͙̭̥̞͓̖̙̬̯̯̫̥̣̜̱̲͈̻̞̻̪̝̜͙̠̥͍͚̙͈͕̮̪̥̭͉̜̖̟̲͖̬̺̱̝̩̠͍̞͉̯̤̰͔̰͇̰̭̣̝̗̘̦̦̤͖͔̝̜̼̬̱͙͉̖̹̳̼̝̯̻̬̦̣͉̬͔̹̫͓̣͔̮͈̟̗͎̰̘̼͈͔̣̭̹̬̞̪̤̹̳͚͙̫͈͕͉̙̪̥͖̙͓̝̣̻̣͇̜̟̹̯̞̠̤̗̹̮̭̳͔̹̘͙̠͎͓̭̬̗͇͚̱̦̥͙̘̭͓̱ͅͅo̫̫̞̘̯͎̙̲̹̬̺̙̥͖̥̬̰͈̲͍̜̗̹̝͇̘̬͉̥̯͈̝̤͈̜̜̦̥̻̝̥̙̰̥̜͖̱̰̺̠̻̤͉̳̰͈̣̱̗̣̘͚͖̼̟̻̦̟̬̖̼͔͓̱̖͈̜̯̗̜͎̝̥̹͇͚͉̩̲̖̞̗̮̬̭̟̘̝͓̫̖͙̻̖̠͔̤̰͈̹̭͔̳̣͓͉̙̼͕͙͙̺̞̗̘͙̠͇̪͚̙̖̱̦̥͚͓̠̤͚͓̟̫͉̭̲̭̻͎̝͓̫̭̝̣̪̭̠̤̫͚̬͈̙̳͖̪̲ͥ͂ͅͅͅͅͅ, or at least stop it from building. |
Having complex numbers as first class citizens was a strong "pro Go" argument when I started learning a language. We have great https://www.gonum.org/ library, which depends on builtin complex numbers a lot. I think we should not make Go being narrowed to some specific domains. |
Everybody is focusing on the "removing functionality" part of this bug and not the "it's weird that big.Int is in a library but complex is in the language" part. Ideally both would be in the library and both would be easy to use with nice syntax. (see "operator methods" references above) It's my fault for writing the initial bug with so little detail. The audience I'd initially considered (Ian, Robert, et al) already knew the context. |
Complex numbers in Go carry an implied algebraic representation (unlike a big integer working around hardware constraints). Rather than ordered pairs Operator methods sound a lot scarier than complex numbers. Aside from any concerns about that: How will operator methods allow |
It's true that |
Go supports complex numbers, but ~nobody uses them.
The only thing complex numbers add to Go is their complexity to Go's runtime, compiler, and standard library.
I propose we remove them from Go 2.
The text was updated successfully, but these errors were encountered: