this post was submitted on 04 May 2024
15 points (94.1% liked)

Rust

6041 readers
8 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

[email protected]

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 2 points 6 months ago (1 children)

Nice article, I enjoyed it. Why float sqrt has been used? Integer sqrt is way faster and easily supports integers of any lengths

[–] farcaster 1 points 6 months ago* (last edited 6 months ago) (1 children)

The builtin u64.isqrt seems to be available in nightly only, and additionally I guess the author didn't want to use any external crates as part of their self-imposed challenge. Though I think there may be an off-by-one result with f64.sqrt I don't think this functionally breaks their u64 code because they loop to root_n + 1.

https://doc.rust-lang.org/std/primitive.u64.html#method.isqrt

[–] [email protected] 1 points 6 months ago (1 children)

Algorithm is so plain and simple, it doesn’t require nightly or Rust specifically to implement.

[–] farcaster 0 points 6 months ago* (last edited 6 months ago) (1 children)

Well, yeah, but you asked why they didn't use integer sqrt. It's something many programming languages just don't have. Or if they do, it's internally implemented as a sqrt(f64) anyway, like C++ does.

Most CPUs AFAIK don't have integer sqrt instructions so you either do it manually in some kind of loop, or you use floating point...

[–] [email protected] 1 points 6 months ago (1 children)

Integer sqrt is usually not a library function and it’s very easy to implement, just a few lines of code. Algorithm is well defined on Wikipedia you read a lot. And yes, it doesn’t use FPU at all and it’s quite fast even on i8086.

[–] farcaster 1 points 6 months ago (1 children)

I doubt doing it in software like that outperforms sqrtss/sqrtsd. Modern CPUs can do the conversions and the floating point sqrt in approximately 20-30 cycles total. That's comparable to one integer division. But I wouldn't mind being proven wrong.

[–] [email protected] 2 points 6 months ago

Integer sqrt can be used for integers with any length, not only for integers fit into f64