9#ifndef FORTRAN_EVALUATE_COMPLEX_H_
10#define FORTRAN_EVALUATE_COMPLEX_H_
12#include "formatting.h"
20namespace Fortran::evaluate::value {
22template <
typename REAL_TYPE>
class Complex {
24 using Part = REAL_TYPE;
25 static constexpr int bits{2 * Part::bits};
29 constexpr Complex(
const Part &r,
const Part &i) : re_{r}, im_{i} {}
30 explicit constexpr Complex(
const Part &r) : re_{r} {}
34 constexpr bool operator==(
const Complex &that)
const {
35 return re_ == that.re_ && im_ == that.im_;
38 constexpr const Part &REAL()
const {
return re_; }
39 constexpr const Part &AIMAG()
const {
return im_; }
40 constexpr Complex CONJG()
const {
return {re_, im_.Negate()}; }
41 constexpr Complex Negate()
const {
return {re_.Negate(), im_.Negate()}; }
43 constexpr bool Equals(
const Complex &that)
const {
44 return re_.Compare(that.re_) == Relation::Equal &&
45 im_.Compare(that.im_) == Relation::Equal;
48 constexpr bool IsZero()
const {
return re_.IsZero() || im_.IsZero(); }
50 constexpr bool IsInfinite()
const {
51 return re_.IsInfinite() || im_.IsInfinite();
54 constexpr bool IsNotANumber()
const {
55 return re_.IsNotANumber() || im_.IsNotANumber();
58 constexpr bool IsSignalingNaN()
const {
59 return re_.IsSignalingNaN() || im_.IsSignalingNaN();
62 template <
typename INT>
64 bool isUnsigned =
false,
65 Rounding rounding = TargetCharacteristics::defaultRounding) {
67 result.value.re_ = Part::FromInteger(n, isUnsigned, rounding)
68 .AccumulateFlags(result.flags);
73 Rounding rounding = TargetCharacteristics::defaultRounding)
const;
75 Rounding rounding = TargetCharacteristics::defaultRounding)
const;
77 Rounding rounding = TargetCharacteristics::defaultRounding)
const;
79 Rounding rounding = TargetCharacteristics::defaultRounding)
const;
83 Rounding rounding = TargetCharacteristics::defaultRounding)
const {
84 return re_.HYPOT(im_, rounding);
87 constexpr Complex FlushSubnormalToZero()
const {
88 return {re_.FlushSubnormalToZero(), im_.FlushSubnormalToZero()};
91 static constexpr Complex NotANumber() {
92 return {Part::NotANumber(), Part::NotANumber()};
95 std::string DumpHexadecimal()
const;
96 llvm::raw_ostream &AsFortran(llvm::raw_ostream &,
int kind)
const;
Definition: target-rounding.h:18
Definition: expression.h:296
Definition: expression.h:317
Definition: expression.h:310
Definition: expression.h:247
Definition: expression.h:303