Killing integer division problems?
bachmeier
no at spam.net
Tue Aug 4 18:11:23 UTC 2020
On Tuesday, 4 August 2020 at 15:43:19 UTC, burt wrote:
> On Tuesday, 4 August 2020 at 15:25:50 UTC, bachmeier wrote:
> That is not what I was proposing (please reread). I am just
> saying that the bottom one (assuming x is int and y is double)
> should issue a warning, unless it is explicitly told that
> integer division is intended.
It may not have been clear from my reply, but I was only saying
whatever is done, if anything, it has to preserve the constraint
that the same division return the same result. That part wasn't a
direct response to your proposal.
>> If x is an int and y is a double, you'd get different results,
>> and that would be awful. What's needed is something explicit
>> like this:
>>
>> y = double(7/3);
>> x = 7/3;
>> y = 7/3; // Error because of implicit cast
>
> This is the same as what I was proposing, except for the syntax
> to explicitly annotate integer division: in your example, you
> use a cast to double (to show you're casting from integer to
> division), in my example, you use a cast to int (to show you're
> truncating). Open for discussion, but the same idea.
It's kind of the same. There are two issues. One is the integer
division that is missed. The other is the silent
casting/promotion of an integer to a double. My opinion is that
it's rarely the case that this code does what you want:
double y = 7/3;
I just don't think that's reasonable. If you do want integer
division *and* you want to store it in a double, you should do
something like
double y = trunc(7.0/3);
or
int x = 7/3;
double y = x;
I see I had an error above. This
y = double(7/3);
should have been
y = double(7)/3;
The former is not clear, while the latter forces the result to be
a double. Your proposal of
y += cast(int) (1 / b);
does tell the viewer there's something going on, but the code is
still not doing what you want. OCaml has its own operator and
requires all integers to be explicitly promoted to float prior to
doing the division. That might be overkill, but I prefer it to
D's current bug-inducing behavior.
More information about the Digitalmars-d
mailing list