ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:100297] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results
@ 2020-10-05  0:35 foldes.laszlo2
  2020-10-05  5:08 ` [ruby-core:100298] " nobu
  2020-10-05 11:16 ` [ruby-core:100299] " foldes.laszlo2
  0 siblings, 2 replies; 3+ messages in thread
From: foldes.laszlo2 @ 2020-10-05  0:35 UTC (permalink / raw)
  To: ruby-core

Issue #17214 has been reported by karatedog (Földes László).

----------------------------------------
Bug #17214: BigDecimal exponentiation gives incorrect results
https://bugs.ruby-lang.org/issues/17214

* Author: karatedog (Földes László)
* Status: Open
* Priority: Normal
* ruby -v: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
> (BigDecimal("2222") ** BigDecimal("3.5")).to_i
=> 517135311000
This is an incorrect value.

> 2222 ** 3.5
=> 517135308457.25256
This is the correct value (within Float precision).

As the Base gets larger, the problem is more visible:
> (BigDecimal("22222") ** BigDecimal("3.5")).to_i
=> 1635840670000000
Wrong value, number of trailing zeroes increase.

> 22222 ** 3.5
=> 1635840670214066.5 (nearing maximum Float precision)





-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:100298] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results
  2020-10-05  0:35 [ruby-core:100297] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results foldes.laszlo2
@ 2020-10-05  5:08 ` nobu
  2020-10-05 11:16 ` [ruby-core:100299] " foldes.laszlo2
  1 sibling, 0 replies; 3+ messages in thread
From: nobu @ 2020-10-05  5:08 UTC (permalink / raw)
  To: ruby-core

Issue #17214 has been updated by nobu (Nobuyoshi Nakada).

Status changed from Open to Rejected

`BigDecimal` instances hold the precision, and it is not enough in that case.
You need to override the default precision in some operations.
```ruby
BigDecimal(2222).power(3.5, Float::DIG).to_i #=> 517135308457
```


----------------------------------------
Bug #17214: BigDecimal exponentiation gives incorrect results
https://bugs.ruby-lang.org/issues/17214#change-87883

* Author: karatedog (Földes László)
* Status: Rejected
* Priority: Normal
* ruby -v: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
This is an incorrect value:

```ruby
(BigDecimal("2222") ** BigDecimal("3.5")).to_i
# => 517135311000
```

This is the correct value (within Float precision):

```ruby
2222 ** 3.5
# => 517135308457.25256
```

As the Base gets larger, the problem is more visible. Wrong value, number of trailing zeroes increase:

```ruby
(BigDecimal("22222") ** BigDecimal("3.5")).to_i
# => 1635840670000000
```

Nearing maximum Float precision:

```ruby
22222 ** 3.5
# => 1635840670214066.5
```



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:100299] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results
  2020-10-05  0:35 [ruby-core:100297] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results foldes.laszlo2
  2020-10-05  5:08 ` [ruby-core:100298] " nobu
@ 2020-10-05 11:16 ` foldes.laszlo2
  1 sibling, 0 replies; 3+ messages in thread
From: foldes.laszlo2 @ 2020-10-05 11:16 UTC (permalink / raw)
  To: ruby-core

Issue #17214 has been updated by karatedog (Földes László).


nobu (Nobuyoshi Nakada) wrote in #note-2:
> `BigDecimal` instances hold the precision, and it is not enough in that case.
> You need to override the default precision in some operations.
> ```ruby
> BigDecimal(2222).power(3.5, Float::DIG).to_i #=> 517135308457
> ```

If I increase the precision of the two arguments ("2222", "3.5"), but leave the operation's precision on default, the result still will be wrong.
So the good result relies only on the precision of the operation which is not straightforward immediately for the developer (because it will return a value).

To sum up:
1. Only #power can be used for proper exponentiation, as #** cannot be given any argument and thus will give almost always wrong results if used with large numbers. Existing code might need to be rewritten, changing class from Float to BigDecimal will not be idempotent.
1. BigDecimal is advertised as an "arbitrary precision library" yet using the defaults it is less precise than Float. This is misleading, it will bite newcomers in the back.

I think this should be documented and/or fine-tuned, the above two violates the Principle of Least Surprise.

----------------------------------------
Bug #17214: BigDecimal exponentiation gives incorrect results
https://bugs.ruby-lang.org/issues/17214#change-87884

* Author: karatedog (Földes László)
* Status: Rejected
* Priority: Normal
* ruby -v: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
This is an incorrect value:

```ruby
(BigDecimal("2222") ** BigDecimal("3.5")).to_i
# => 517135311000
```

This is the correct value (within Float precision):

```ruby
2222 ** 3.5
# => 517135308457.25256
```

As the Base gets larger, the problem is more visible. Wrong value, number of trailing zeroes increase:

```ruby
(BigDecimal("22222") ** BigDecimal("3.5")).to_i
# => 1635840670000000
```

Nearing maximum Float precision:

```ruby
22222 ** 3.5
# => 1635840670214066.5
```



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-10-05 11:16 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05  0:35 [ruby-core:100297] [Ruby master Bug#17214] BigDecimal exponentiation gives incorrect results foldes.laszlo2
2020-10-05  5:08 ` [ruby-core:100298] " nobu
2020-10-05 11:16 ` [ruby-core:100299] " foldes.laszlo2

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).