Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/float/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 26.7.2025 mit Größe 20 kB image not shown  

Quelle  cxsc.gi   Sprache: unbekannt

 
#############################################################################
##
#W  cxsc.gi                        GAP library              Laurent Bartholdi
##
#Y  Copyright (C) 2008 Laurent Bartholdi
##
##  This file deals with floats
##

################################################################
# viewers
################################################################
InstallMethod(ViewString, "cxsc:*", [IsCXSCFloat],
        function(obj)
    return STRING_CXSC(obj,0,FLOAT.VIEW_DIG);
end);

InstallOtherMethod(String, "cxsc:*,len,digits", [IsCXSCFloat,IsInt,IsInt],
        STRING_CXSC);

InstallMethod(String, "cxsc:*, int", [IsCXSCFloat, IsInt],
        function(obj,len)
    return STRING_CXSC(obj,0,len);
end);
        
InstallMethod(String, "cxsc:*", [IsCXSCFloat],
        obj->STRING_CXSC(obj,0,FLOAT.DECIMAL_DIG));

BindGlobal("CXSC_STRING", function(s)
    if 'i' in s or 'I' in s then
        return CP_CXSC_STRING(s);
    elif '(' in s and '[' in s then
        return CI_CXSC_STRING(s);
    elif '(' in s then
        return CP_CXSC_STRING(s);
    elif '[' in s then
        return RI_CXSC_STRING(s);
    else
        return RP_CXSC_STRING(s);
    fi;
end);

InstallMethod(PrecisionFloat, "cxsc:*", [IsCXSCFloat], x->CXSC.constants.MANT_DIG);

################################################################
# fields
################################################################
DeclareCategory("IsCXSCPseudoField", IsFloatPseudoField);

BindGlobal("CXSC_PSEUDOFIELD",
        Objectify(NewType(CollectionsFamily(CXSCFloatsFamily),
                IsCXSCPseudoField and IsAttributeStoringRep),rec()));
SetName(CXSC_PSEUDOFIELD, FLOAT_COMPLEX_STRING);

SetIsUFDFamily(CXSCFloatsFamily,true);
SetZero(CXSCFloatsFamily,CXSC_INT(0));
SetOne(CXSCFloatsFamily,CXSC_INT(1));

SetLeftActingDomain(CXSC_PSEUDOFIELD,Rationals);
SetCharacteristic(CXSC_PSEUDOFIELD,0);
SetDimension(CXSC_PSEUDOFIELD,infinity);
SetSize(CXSC_PSEUDOFIELD,infinity);
SetIsWholeFamily(CXSC_PSEUDOFIELD,true);
SetZero(CXSC_PSEUDOFIELD,CXSC_INT(0));
SetOne(CXSC_PSEUDOFIELD,CXSC_INT(1));
InstallMethod( \in, [IsCXSCFloat,IsCXSCPseudoField], ReturnTrue);

################################################################
# constants
################################################################
InstallValue(CXSC, rec(creator := CXSC_STRING,
    eager := 'X',
    filter := IsCXSCFloat,
    field := CXSC_PSEUDOFIELD,
    reals := CXSC, # we don't distinguish the reals and complex fields here
    constants := rec(INFINITY := CXSC_NEWCONSTANT(3),
        NINFINITY := AINV_CXSC_RP(CXSC_NEWCONSTANT(3)),
        MAX := CXSC_NEWCONSTANT(2),
        NAN := CXSC_NEWCONSTANT(5),
        DIG := 15,
        VIEW_DIG := 6,
        MANT_DIG := 53,
        MAX_10_EXP := 308,
        MAX_EXP := 1024,
        MIN_10_EXP := -307,
        MIN_EXP := -1021,
        DECIMAL_DIG := 17,
        I := CP_CXSC_RP_RP(CXSC_INT(0),CXSC_INT(1)),
        2IPI := CP_CXSC_RP_RP(CXSC_INT(0),CXSC_NEWCONSTANT(7))
)));

InstallMethod(ObjByExtRep, [IsCXSCFloatFamily,IsCyclotomicCollection],
        function(family,obj)
    if Length(obj)=2 then
        return OBJBYEXTREP_CXSC_RP(obj);
    else
        Error("Ambiguous: is ",obj," a complex or interval CXSC? Use NewFloat(...)");
    fi;
end);

EAGER_FLOAT_LITERAL_CONVERTERS.X := CXSC_STRING;
EAGER_FLOAT_LITERAL_CONVERTERS.R := RP_CXSC_STRING;
EAGER_FLOAT_LITERAL_CONVERTERS.C := CP_CXSC_STRING;
EAGER_FLOAT_LITERAL_CONVERTERS.I := RI_CXSC_STRING;
EAGER_FLOAT_LITERAL_CONVERTERS.B := CI_CXSC_STRING;

################################################################
# unary operations
################################################################
InstallMethod(ZeroMutable,[IsCXSCReal],x->0.0_R);
InstallMethod(ZeroMutable,[IsCXSCComplex],x->0.0_C);
InstallMethod(ZeroMutable,[IsCXSCInterval],x->0.0_I);
InstallMethod(ZeroMutable,[IsCXSCBox],x->0.0_B);
InstallMethod(ZeroSameMutability,[IsCXSCReal],x->0.0_R);
InstallMethod(ZeroSameMutability,[IsCXSCComplex],x->0.0_C);
InstallMethod(ZeroSameMutability,[IsCXSCInterval],x->0.0_I);
InstallMethod(ZeroSameMutability,[IsCXSCBox],x->0.0_B);
InstallMethod(ZeroImmutable,[IsCXSCReal],x->0.0_R);
InstallMethod(ZeroImmutable,[IsCXSCComplex],x->0.0_C);
InstallMethod(ZeroImmutable,[IsCXSCInterval],x->0.0_I);
InstallMethod(ZeroImmutable,[IsCXSCBox],x->0.0_B);

InstallMethod(OneMutable,[IsCXSCReal],x->1.0_R);
InstallMethod(OneMutable,[IsCXSCComplex],x->1.0_C);
InstallMethod(OneMutable,[IsCXSCInterval],x->1.0_I);
InstallMethod(OneMutable,[IsCXSCBox],x->1.0_B);
InstallMethod(OneSameMutability,[IsCXSCReal],x->1.0_R);
InstallMethod(OneSameMutability,[IsCXSCComplex],x->1.0_C);
InstallMethod(OneSameMutability,[IsCXSCInterval],x->1.0_I);
InstallMethod(OneSameMutability,[IsCXSCBox],x->1.0_B);
InstallMethod(OneImmutable,[IsCXSCReal],x->1.0_R);
InstallMethod(OneImmutable,[IsCXSCComplex],x->1.0_C);
InstallMethod(OneImmutable,[IsCXSCInterval],x->1.0_I);
InstallMethod(OneImmutable,[IsCXSCBox],x->1.0_B);

InstallMethod(Int, [IsCXSCReal], function(x)
    local i, w, n;
    w := INT_CXSC(x);
    if w=fail then
        i := 1;
        repeat
            n := INT_CXSC(x/i);
            i := 2*i;
        until n<>fail;
        i := i/2;
        w := 0;
        repeat
            w := w+n*i;
            x := x-n*i;
            i := i/2;
            n := INT_CXSC(x/i);
        until i=1;
    fi;
    return w;
end);
InstallMethod(Int, [IsCXSCInterval], x->Int(Sup(x)));

CallFuncList(function(arg)
    local i;
    for i in arg do
        InstallOtherMethod(VALUE_GLOBAL(i[1]), "cxsc:rp", [IsCXSCReal],
                VALUE_GLOBAL(Concatenation(i[2],"_RP")));
        InstallOtherMethod(VALUE_GLOBAL(i[1]), "cxsc:cp", [IsCXSCComplex],
                VALUE_GLOBAL(Concatenation(i[2],"_CP")));
        InstallOtherMethod(VALUE_GLOBAL(i[1]), "cxsc:ri", [IsCXSCInterval],
                VALUE_GLOBAL(Concatenation(i[2],"_RI")));
        InstallOtherMethod(VALUE_GLOBAL(i[1]), "cxsc:ci", [IsCXSCBox],
                VALUE_GLOBAL(Concatenation(i[2],"_CI")));
    od;
end,   [["AdditiveInverseSameMutability","AINV_CXSC"],
        ["AdditiveInverseMutable","AINV_CXSC"],
        ["InverseMutable","INV_CXSC"],
        ["InverseSameMutability","INV_CXSC"],
        ["AbsoluteValue","ABS_CXSC"],
        ["Sqrt","SQRT_CXSC"],
        ["Cos","COS_CXSC"],
        ["Sin","SIN_CXSC"],
        ["Tan","TAN_CXSC"],
        ["Cot","COT_CXSC"],
        ["Asin","ASIN_CXSC"],
        ["Acos","ACOS_CXSC"],
        ["Atan","ATAN_CXSC"],
        ["Cosh","COSH_CXSC"],
        ["Sinh","SINH_CXSC"],
        ["Tanh","TANH_CXSC"],
        ["Coth","COTH_CXSC"],
        ["Asinh","ASINH_CXSC"],
        ["Acosh","ACOSH_CXSC"],
        ["Atanh","ATANH_CXSC"],
        ["Log","LOG_CXSC"],
        ["Log1p","LOG1P_CXSC"],
        ["Log2","LOG2_CXSC"],
        ["Log10","LOG10_CXSC"],
        ["Exp","EXP_CXSC"],
        ["Expm1","EXPM1_CXSC"],
        ["FrExp","FREXP_CXSC"],
        ["ExtRepOfObj","EXTREPOFOBJ_CXSC"],
        ["IsNaN","ISNAN_CXSC"],
        ["IsFinite","ISNUMBER_CXSC"],
        ["IsPInfinity","ISPINF_CXSC"],
        ["IsNInfinity","ISNINF_CXSC"],
        ["IsXInfinity","ISXINF_CXSC"],
        ["IsZero","ISZERO_CXSC"],
        ["IsOne","ISONE_CXSC"],
        ["Square","SQR_CXSC"]]);

InstallMethod(SignFloat, "cxsc:rp", [IsCXSCReal], SIGN_CXSC_RP);
InstallMethod(SignFloat, "cxsc:ri", [IsCXSCInterval], SIGN_CXSC_RI);
InstallMethod(Hypothenuse, "cxsc:rp", [IsCXSCReal,IsCXSCReal], HYPOT_CXSC_RP2);

################################################################
# interval stuff
################################################################

InstallMethod(Inf, "cxsc:ri", [IsCXSCInterval], INF_CXSC_RI);
InstallMethod(Sup, "cxsc:ri", [IsCXSCInterval], SUP_CXSC_RI);
InstallMethod(Mid, "cxsc:ri", [IsCXSCInterval], MID_CXSC_RI);
InstallMethod(AbsoluteDiameter, "cxsc:ri", [IsCXSCInterval], DIAM_CXSC_RI);
InstallMethod(RelativeDiameter, "cxsc:ri", [IsCXSCInterval], DIAM_REL_CXSC_RI);
InstallMethod(Inf, "cxsc:ci", [IsCXSCBox], INF_CXSC_CI);
InstallMethod(Sup, "cxsc:ci", [IsCXSCBox], SUP_CXSC_CI);
InstallMethod(Mid, "cxsc:ci", [IsCXSCBox], MID_CXSC_CI);
InstallMethod(AbsoluteDiameter, "cxsc:ci", [IsCXSCBox], DIAM_CXSC_CI);
InstallMethod(RelativeDiameter, "cxsc:ci", [IsCXSCBox], DIAM_REL_CXSC_CI);

InstallMethod(IsDisjoint, "cxsc:ri,ri", [IsCXSCInterval,IsCXSCInterval],
        DISJOINT_CXSC_RI_RI);
InstallMethod(IN, "cxsc:rp,ri", [IsCXSCReal,IsCXSCInterval], SUM_FLAGS,
        IN_CXSC_RP_RI);
InstallMethod(IN, "cxsc:ri,ri", [IsCXSCInterval,IsCXSCInterval], SUM_FLAGS,
        IN_CXSC_RI_RI);
InstallMethod(IN, "cxsc:rp,ci", [IsCXSCReal,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_RP_CI);
InstallMethod(IN, "cxsc:cp,ci", [IsCXSCComplex,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_CP_CI);
InstallMethod(IN, "cxsc:ri,ci", [IsCXSCInterval,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_RI_CI);
InstallMethod(IN, "cxsc:ci,ci", [IsCXSCBox,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_CI_CI);
InstallMethod(IsSubset, "cxsc:ri,ri", [IsCXSCInterval,IsCXSCInterval], SUM_FLAGS,
        IN_CXSC_RI_RI);
InstallMethod(IsSubset, "cxsc:ri,ci", [IsCXSCInterval,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_RI_CI);
InstallMethod(IsSubset, "cxsc:ci,ci", [IsCXSCBox,IsCXSCBox], SUM_FLAGS,
        IN_CXSC_CI_CI);
InstallMethod(IsDisjoint, "cxsc:ci,ci", [IsCXSCBox,IsCXSCBox],
        DISJOINT_CXSC_CI_CI);
InstallOtherMethod(Union2, "cxsc:ri,ri", [IsCXSCInterval,IsCXSCInterval],
        OR_CXSC_RI_RI);
InstallOtherMethod(Union2, "cxsc:ri,ci", [IsCXSCInterval,IsCXSCBox],
        OR_CXSC_RI_CI);
InstallOtherMethod(Union2, "cxsc:ci,ri", [IsCXSCBox,IsCXSCInterval],
        OR_CXSC_CI_RI);
InstallOtherMethod(Union2, "cxsc:ci,ci", [IsCXSCBox,IsCXSCBox],
        OR_CXSC_CI_CI);
InstallOtherMethod(Intersection2, "cxsc:ri,ri", [IsCXSCInterval,IsCXSCInterval],
        AND_CXSC_RI_RI);
InstallOtherMethod(Intersection2, "cxsc:ri,ci", [IsCXSCInterval,IsCXSCBox],
        AND_CXSC_RI_CI);
InstallOtherMethod(Intersection2, "cxsc:ci,ri", [IsCXSCBox,IsCXSCInterval],
        AND_CXSC_CI_RI);
InstallOtherMethod(Intersection2, "cxsc:ci,ci", [IsCXSCBox,IsCXSCBox],
        AND_CXSC_CI_CI);

InstallMethod(Value, [IsFloatUnivariatePolynomial, IsCXSCReal],
        function(poly,r)
    local v;
    poly := CoefficientsOfUnivariatePolynomial(poly);
    if not ForAll(poly,c->IsCXSCReal(c) or IsCXSCComplex(c)) then
        TryNextMethod();
    fi;
    v := EVALPOLY_CXSC(poly,r);
    if v=fail then TryNextMethod(); fi;
    return v[1];
end);

InstallMethod(ValueInterval, [IsFloatUnivariatePolynomial, IsCXSCReal],
        function(poly,r)
    local v;
    poly := CoefficientsOfUnivariatePolynomial(poly);
    if not ForAll(poly,c->IsCXSCReal(c) or IsCXSCComplex(c)) then
        TryNextMethod();
    fi;
    v := EVALPOLY_CXSC(poly,r);
    if v=fail then TryNextMethod(); fi;
    return v[2];
end);

################################################################
# complex stuff
################################################################
InstallMethod(RealPart, "cxsc:rp", [IsCXSCReal], x->x);
InstallMethod(RealPart, "cxsc:ri", [IsCXSCInterval], x->x);
InstallMethod(RealPart, "cxsc:cp", [IsCXSCComplex], REAL_CXSC_CP);
InstallMethod(RealPart, "cxsc:ci", [IsCXSCBox], REAL_CXSC_CI);
InstallMethod(ImaginaryPart, "cxsc:cp", [IsCXSCReal], x->0.0_R);
InstallMethod(ImaginaryPart, "cxsc:ci", [IsCXSCInterval], x->0.0_I);
InstallMethod(ImaginaryPart, "cxsc:cp", [IsCXSCComplex], IMAG_CXSC_CP);
InstallMethod(ImaginaryPart, "cxsc:ci", [IsCXSCBox], IMAG_CXSC_CI);
InstallMethod(ComplexConjugate, "cxsc:rp", [IsCXSCReal], x->x);
InstallMethod(ComplexConjugate, "cxsc:ri", [IsCXSCInterval], x->x);
InstallMethod(ComplexConjugate, "cxsc:cp", [IsCXSCComplex], CONJ_CXSC_CP);
InstallMethod(ComplexConjugate, "cxsc:ci", [IsCXSCBox], CONJ_CXSC_CI);
InstallMethod(Norm, "cxsc:rp", [IsCXSCReal], SQR_CXSC_RP);
InstallMethod(Norm, "cxsc:ri", [IsCXSCInterval], SQR_CXSC_RI);
InstallMethod(Norm, "cxsc:cp", [IsCXSCComplex], NORM_CXSC_CP);
InstallMethod(Norm, "cxsc:ci", [IsCXSCBox], NORM_CXSC_CI);
        
################################################################
# binary operations
################################################################
CallFuncList(function(arg)
    local i, j;
    for i in arg do
        for j in Tuples([["RP",IsCXSCReal],["CP",IsCXSCComplex],["RI",IsCXSCInterval],["CI",IsCXSCBox]],2) do
            InstallMethod(VALUE_GLOBAL(i), Concatenation("cxsc:",j[1][1],",",j[2][1]),
                    j{[1..2]}[2], VALUE_GLOBAL(Concatenation(i,"_CXSC_",j[1][1],"_",j[2][1])));
        od;
        CallFuncList(function(oper)
            InstallOtherMethod(oper,"float,cyc",[IsCXSCFloatRep,IsCyc],
                    function(x,y)
                return oper(x,MakeFloat(x,y));
            end);
            InstallOtherMethod(oper,"float,any",[IsCyc,IsCXSCFloatRep],
                    function(x,y)
                return oper(MakeFloat(y,x),y);
            end);
        end,[VALUE_GLOBAL(i)]);
    od;
end, ["SUM","DIFF","QUO","PROD","POW","EQ","LT"]);

BindGlobal("CXSC_POW_RAT", function(f,r,POWER,ROOT)
    local d, n;
    d := DenominatorRat(r);
    n := NumeratorRat(r);
    if AbsoluteValue(n)<2^28 then
        f := POWER(f,n);
    else
        TryNextMethod();
    fi;
    if d<2^28 then
        f := ROOT(f,d);
    else
        TryNextMethod();
    fi;
    return f;
end);

InstallMethod(\^, "cxsc:, rat", [IsCXSCReal, IsRat],
        function(f,r)
    return CXSC_POW_RAT(f,r,POWER_CXSC_RP,ROOT_CXSC_RP);
end);
InstallMethod(\^, "cxsc:, rat", [IsCXSCComplex, IsRat],
        function(f,r)
    return CXSC_POW_RAT(f,r,POWER_CXSC_CP,ROOT_CXSC_CP);
end);
InstallMethod(\^, "cxsc:, rat", [IsCXSCInterval, IsRat],
        function(f,r)
    return CXSC_POW_RAT(f,r,POWER_CXSC_RI,ROOT_CXSC_RI);
end);
InstallMethod(\^, "cxsc:, rat", [IsCXSCBox, IsRat],
        function(f,r)
    return CXSC_POW_RAT(f,r,POWER_CXSC_CI,ROOT_CXSC_CI);
end);

InstallMethod(Atan2, "cxsc:rp,rp", [IsCXSCReal,IsCXSCReal], ATAN2_CXSC_RP_RP);
InstallOtherMethod(Atan2, "cxsc:cp", [IsCXSCComplex], ATAN2_CXSC_CP);
InstallOtherMethod(Atan2, "cxsc:ci", [IsCXSCBox], ATAN2_CXSC_CI);

InstallMethod(LdExp, "cxsc:rp, int", [IsCXSCReal, IsInt], LDEXP_CXSC_RP);
InstallMethod(LdExp, "cxsc:ri, int", [IsCXSCInterval, IsInt], LDEXP_CXSC_RI);
InstallMethod(LdExp, "cxsc:cp, int", [IsCXSCComplex, IsInt], LDEXP_CXSC_CP);
InstallMethod(LdExp, "cxsc:ci, int", [IsCXSCBox, IsInt], LDEXP_CXSC_CI);

################################################################
# roots
################################################################
InstallMethod(RootsFloatOp, "cxsc: list, cxsc:ci", [IsList,IsCXSCFloat],
        function(p,filter)
    return ROOTPOLY_CXSC(p,false);
end);

################################################################
# default constructors
################################################################
INSTALLFLOATCREATOR("for lists", [IsCXSCFloat,IsList],
        function(filter,list)
    return OBJBYEXTREP_CXSC_RP(list);
end);

INSTALLFLOATCREATOR("for integers", [IsCXSCFloat,IsInt],
        function(filter,int)
    local f, m;
    f := 0.0_R;
    m := 1.0_R;
    while int <> 0 do
        f := f + m*CXSC_INT(RemInt(int,2^27));
        int := QuoInt(int,2^27);
        m := LdExp(m,27);
    od;
    return f;
end);

INSTALLFLOATCREATOR("for strings", [IsCXSCFloat,IsString],
        function(filter,s)
    if 'i' in s or 'I' in s then
        return CP_CXSC_STRING(s);
    else
        return RP_CXSC_STRING(s);
    fi;
end);

INSTALLFLOATCREATOR("for strings", [IsCXSCReal,IsFloat],
        function(filter,s)
    return RP_CXSC_STRING(s);
end);

INSTALLFLOATCREATOR("for cxsc:rp", [IsCXSCReal,IsIEEE754FloatRep],
        function(filter,x)
    return CXSC_IEEE754(x);
end);

################################################################
# real constructors
################################################################
INSTALLFLOATCREATOR("for lists", [IsCXSCReal,IsList],
        function(filter,list)
    return OBJBYEXTREP_CXSC_RP(list);
end);

INSTALLFLOATCREATOR("for integers", [IsCXSCReal,IsInt],
        function(filter,int)
    local f, m;
    f := 0.0_R;
    m := 1.0_R;
    while int <> 0 do
        f := f + m*CXSC_INT(RemInt(int,2^27));
        int := QuoInt(int,2^27);
        m := LdExp(m,27);
    od;
    return f;
end);

INSTALLFLOATCREATOR("for strings", [IsCXSCReal,IsString],
        function(filter,s)
    return RP_CXSC_STRING(s);
end);

INSTALLFLOATCREATOR("for cxsc:rp", [IsCXSCReal,IsCXSCReal],
        function(filter,x)
    return x;
end);

INSTALLFLOATCONSTRUCTORS(rec(filter:=IsCXSCReal, constants := CXSC.constants));

################################################################
# complex constructors
################################################################
INSTALLFLOATCREATOR("for lists", [IsCXSCComplex,IsList],
        function(filter,list)
    return OBJBYEXTREP_CXSC_CP(list);
end);

INSTALLFLOATCREATOR("for ints", [IsCXSCComplex,IsInt],
        function(filter,x)
    return CP_CXSC_RP(NewFloat(IsCXSCReal,x));
end);

DECLAREFLOATCREATOR(IsCXSCComplex,IsCXSCReal,IsCXSCReal);
INSTALLFLOATCREATOR("for two reals", [IsCXSCComplex,IsCXSCReal,IsCXSCReal],
        function(filter,x,y)
    return CP_CXSC_RP_RP(x,y);
end);
                
DECLAREFLOATCREATOR(IsCXSCComplex,IsInt,IsInt);
INSTALLFLOATCREATOR("for two ints", [IsCXSCComplex,IsInt,IsInt],
        function(filter,x,y)
    return CP_CXSC_RP_RP(NewFloat(IsCXSCReal,x),NewFloat(IsCXSCReal,y));
end);
                
INSTALLFLOATCREATOR("for strings", [IsCXSCComplex,IsString],
        function(filter,s)
    return CP_CXSC_STRING(s);
end);

INSTALLFLOATCREATOR("for a real", [IsCXSCComplex,IsCXSCReal],
        function(filter,x)
    return CP_CXSC_RP(x);
end);

INSTALLFLOATCREATOR("for a complex", [IsCXSCComplex,IsCXSCComplex],
        function(filter,x)
    return x;
end);

INSTALLFLOATCONSTRUCTORS(rec(filter:=IsCXSCComplex));

################################################################
# interval constructors
################################################################
INSTALLFLOATCREATOR("for lists", [IsCXSCInterval,IsList],
        function(filter,list)
    return OBJBYEXTREP_CXSC_RI(list);
end);

INSTALLFLOATCREATOR("for ints", [IsCXSCInterval,IsInt],
        function(filter,x)
    return RI_CXSC_RP(NewFloat(IsCXSCReal,x));
end);

DECLAREFLOATCREATOR(IsCXSCInterval,IsCXSCReal,IsCXSCReal);
INSTALLFLOATCREATOR("for two reals", [IsCXSCInterval,IsCXSCReal,IsCXSCReal],
        function(filter,x,y)
    return RI_CXSC_RP_RP(x,y);
end);
                
DECLAREFLOATCREATOR(IsCXSCInterval,IsInt,IsInt);
INSTALLFLOATCREATOR("for two integers", [IsCXSCInterval,IsInt,IsInt],
        function(filter,x,y)
    return RI_CXSC_RP_RP(NewFloat(IsCXSCReal,x),NewFloat(IsCXSCReal,y));
end);
                
INSTALLFLOATCREATOR("for strings", [IsCXSCInterval,IsString],
        function(filter,s)
    return RI_CXSC_STRING(s);
end);

INSTALLFLOATCREATOR("for a real", [IsCXSCInterval,IsCXSCReal],
        function(filter,x)
    return RI_CXSC_RP(x);
end);

INSTALLFLOATCREATOR("for an interval", [IsCXSCInterval,IsCXSCInterval],
        function(filter,x)
    return x;
end);

INSTALLFLOATCONSTRUCTORS(rec(filter:=IsCXSCInterval));

################################################################
# complex interval constructors
################################################################
INSTALLFLOATCREATOR("for lists", [IsCXSCBox,IsList],
        function(filter,list)
    return OBJBYEXTREP_CXSC_CP(list);
end);

INSTALLFLOATCREATOR("for ints", [IsCXSCBox,IsInt],
        function(filter,x)
    return CI_CXSC_RI_RI(NewFloat(IsCXSCInterval,x),0.0_I);
end);

DeclareConstructor("NewFloat", [IsCXSCBox,IsCXSCReal,IsCXSCReal]);
DeclareOperation("MakeFloat", [IsCXSCBox,IsCXSCReal,IsCXSCReal]);
DeclareConstructor("NewFloat", [IsCXSCBox,IsCXSCComplex,IsCXSCComplex]);
DeclareOperation("MakeFloat", [IsCXSCBox,IsCXSCComplex,IsCXSCComplex]);
DeclareConstructor("NewFloat", [IsCXSCBox,IsCXSCInterval,IsCXSCInterval]);
DeclareOperation("MakeFloat", [IsCXSCBox,IsCXSCInterval,IsCXSCInterval]);

INSTALLFLOATCREATOR("for two reals", [IsCXSCBox,IsCXSCReal,IsCXSCReal],
        function(filter,x,y)
    return CI_CXSC_CP(CP_CXSC_RP_RP(x,y));
end);
                
INSTALLFLOATCREATOR("for two complexes", [IsCXSCBox,IsCXSCComplex,IsCXSCComplex],
        function(filter,x,y)
    return CI_CXSC_CP_CP(x,y);
end);
                
INSTALLFLOATCREATOR("for two intervals", [IsCXSCBox,IsCXSCInterval,IsCXSCInterval],
        function(filter,x,y)
    return CI_CXSC_RI_RI(x,y);
end);
                
INSTALLFLOATCREATOR("for strings", [IsCXSCBox,IsString],
        function(filter,s)
    return CI_CXSC_STRING(s);
end);

INSTALLFLOATCREATOR("for a real", [IsCXSCBox,IsCXSCReal],
        function(filter,x)
    return CI_CXSC_CP(CP_CXSC_RP(x));
end);

INSTALLFLOATCREATOR("for a complex", [IsCXSCBox,IsCXSCComplex],
        function(filter,x)
    return CI_CXSC_CP(x);
end);

INSTALLFLOATCREATOR("for an interval", [IsCXSCBox,IsCXSCInterval],
        function(filter,x)
    return CI_CXSC_RI_RI(x,0.0_I);
end);

INSTALLFLOATCREATOR("for a box", [IsCXSCBox,IsCXSCBox],
        function(filter,x)
    return x;
end);

INSTALLFLOATCONSTRUCTORS(rec(filter:=IsCXSCBox));

#############################################################################
##
#E

[ Dauer der Verarbeitung: 0.37 Sekunden  (vorverarbeitet)  ]