The problem is that you may be specifying the dataype of the result set, but you aren't specifying the datatype for the literal numbers. ASE is defaulting these to INTs, and (INT) (894720* (INT) 4096 overflows what an INT can hold before it would be converted to a float.
If you added a ".0" to each of these values, ASE would default them to a float or numeric datatype.
You could also use an explicit convert(float, ...) around each literal value.
It is never a bad idea to cast literal values to a specific datatype.