Compatibility
Ultra Fractal 5 accepts almost all formulas written for earlier versions of
Ultra Fractal. There are many changes in the compiler since Ultra Fractal 4, but the language has been changed in such a way that existing formulas will still compile. The new language features are accessed with semi-reserved keywords, meaning that you can still use them as variable names. This ensures that there will not be a conflict with existing formulas.
There are some minor differences in the compiler since Ultra Fractal 2:
- There are a three new keywords:
color, heading, and endheading. Variables with these
names will have to be renamed. Parameters with these names should not be renamed
to avoid breaking backwards compatibility. Instead, add a @ character to the
parameter name in the parameter block that describes it, so the compiler will
recognize it as a parameter, not as a keyword. For example, "param color"
should be changed to "param @color".
- Some formulas might not run well with double precision (Ultra Fractal 2
always uses extended precision). In this case, either correct the formula,
or adjust the Additional Precision value in the Formula tab of the
Layer Properties tool window
so extended precision is used. You can verify this in the Statistics
tool window. Also see Arbitrary
precision.
- Built-in functions that can return complex values with float arguments are treated
differently. If the return value is assigned to a complex variable, the float
argument is converted to complex and the complex version of the function is
called instead of the float version. This fixes a number of bugs like:
complex c = sqrt(-1)
; should be (0, 1)
Unfortunately, sometimes it breaks backwards compatibility because Ultra Fractal
2 would assign an invalid value to c in this case. To work around this, use:
float f = sqrt(-1)
complex c = f
The formula compiler is largely compatible with Fractint's parser and most
Fractint formulas can be used without modification. There are a few exceptions,
however:
- Writing to parameters is not recommended, since Ultra Fractal can perform
special optimizations when parameters are read-only. Formulas writing to parameters
will be accepted, though.
- Writing to predefined
symbols that are read-only, such as #pixel,
is not allowed. Formulas writing to these predefined symbols will not be accepted.
- Formulas using the predefined symbol LastSqr will not be accepted. The usage
of LastSqr serves no purpose; it is intended as a speed-up but it only makes
formulas run slower (even in Fractint). Furthermore it makes formulas very
hard to write and to understand.
- Formulas using the function cosxx will not be accepted either. This function
results from an early version of Fractint which contained a bug in the cos
function. The cosxx function allows you to reproduce this bug in later versions
of Fractint. If you still want to use the cosxx function, you can write conj(cos(a))
instead of cosxx(a).
- In Fractint, built-in functions with invalid arguments often return other values
than in Ultra Fractal. For example. log(0) returns 0 in Fractint, but it returns
-infinity in Ultra Fractal. This can cause problems. In general, if a Fractint
formula gives a blank screen instead of a fractal, you should check the formula
for this kind of errors (log(0), division by zero, recip(0), etc).
- Fractint iterates fractal formulas not the number of times given by the
maximum iterations value, but one time less. Ultra Fractal does iterate fractal
formulas the number of times given by the maximum iterations value. The Fractint
PAR import feature in Ultra Fractal takes this into account and subtracts
one from the maximum iterations value used by Fractint.
Generally, formulas that depend on the forgiving behaviour of Fractint's parser
will not be accepted. Often Fractint accepts formulas that contain syntax errors
and it will still produce a picture. Ultra Fractal will refuse to load such
formulas. This is useful, because it helps you to write clear and understandable
formulas, and it might point you in the direction of possible errors.
Next: Execution sequence
See Also
Invalid operations