Killing integer division problems?

bachmeier no at spam.net
Tue Aug 4 15:25:50 UTC 2020


On Tuesday, 4 August 2020 at 12:34:37 UTC, burt wrote:
> Hello,
>
> A while ago I spent an hour figuring out why some variable 
> wasn't changing like it should, and the reason was something 
> like the following (although in a much more complex expression):
>
> ```d
> double y = 0.0;
> // ...
> y += 1 / b; // with b : int
> // ...
> ```
>
> I have run into this C remnant multiple times now and spent 
> much too long trying to find out what happened, so to fix it, 
> here's my proposal:
>
> "Make integer division without cast illegal."
>
> In the case above, the compiler would complain (or at least 
> emit a warning) that there is integer division going on and 
> that the result will be truncated.
>
> If I want to keep the integer division behaviour, I would just 
> have to change the code to:
>
> ```d
> y += cast(int) (1 / b);
> ```

This would be *really* confusing. y is a double in your example, 
and the user would be forced to cast to an int in order to enable 
an implicit cast (or promotion, or whatever language you want to 
use) to a double?

I hate the current default behavior. It's not safe but it is 
consistent with what a C programmer will expect. You can't have 
these yielding different values:

```
x = 7/3;
y = 7/3;
```

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

There is precedent for this in the change to foreach. This code

import std;
void main()
{
     foreach(int ii, val; [1.1, 2.2, 3.3]) {
         writeln(ii);
         writeln(val);
     }
}

returns

onlineapp.d(4): Deprecation: foreach: loop index implicitly 
converted from size_t to int
0
1.1
1
2.2
2
3.3

You have to do the casting inside the loop instead.


More information about the Digitalmars-d mailing list