[Issue 15288] New: The exponentiation operator ^^ doesn't follow the standard type promotion rules.
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Thu Nov 5 00:39:59 PST 2015
https://issues.dlang.org/show_bug.cgi?id=15288
Issue ID: 15288
Summary: The exponentiation operator ^^ doesn't follow the
standard type promotion rules.
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: thomas.bockman at gmail.com
Currently, the exponentiation operator `x ^^ y` always returns a value of the
same type as the base `x`.
I believe this should be changed to follow type promotion rules like those used
by the conceptually related shift operators, or by the Phobos `std.math.pow()`
function.
Key changes needed:
1. Promote small integral types (like `byte` or `ushort`) to `int`, as all
other operators do.
2. If the exponent is floating-point, promote the base to floating-point as
well.
Benefits:
1. Aligning the behaviour of exponentiation with the other operators is
necessary to satisfy the "principle of least surprise".
2. Promoting small integer types generally leads to more efficient code
generation.
The following sample code highlights the discrepancies between the built-in
operator and the Phobos function:
module main;
import std.stdio;
import std.traits : Unqual, NumericTypeList;
import std.math : pow;
void main(string[] args) {
foreach(N; NumericTypeList) {
foreach(M; NumericTypeList) {
const builtIn = cast(N)1 ^^ cast(M)1;
const phobos = pow(cast(N)1, cast(M)1);
static if(!is(typeof(builtIn) == typeof(phobos))) {
writeln("(" ~ N.stringof ~ ") ^^ (" ~ M.stringof ~ ") == " ~
Unqual!(typeof(builtIn)).stringof);
writeln("pow(" ~ N.stringof ~ ", " ~ M.stringof ~ ") == " ~
Unqual!(typeof(phobos)).stringof);
writeln();
}
}
}
stdin.readln();
}
--
More information about the Digitalmars-d-bugs
mailing list