XPEHOMETP
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Результат преобразования 16-битных чисел в 10-битные (или 8-битные) - это классический пример вычислений с потерей точности. В общем, все законно, жаловаться не на кого. Про процесс оптимизации при желании кое-что могут сказать. В частности, указывают на объединение постоянных: если было х*4*8, станет х*32. То есть какие-то константы могут быть не как числа, а как переменные с некоторым значением, которое для данного случая компилятору точно известно; их тоже объединят. Одинаковые куски тоже не вычисляют два раза, но только в границах ОДНОГО ВЫРАЖЕНИЯ: Elimination of common subexpressions within a statement. Again, this applies equally to expressions which form subscript calculations. Consider the following assignment: A(I,J+K) = A(I,J+K) + 3 - здесь I,J+K посчитают один раз, а вставят два раза. Цитата из справки к компилятору Salford FTN95. Замена ранее сосчитанным выражением (где-то в другой строчке) возможна, похоже, только в пределах цикла, их причесывают наиболее тщательно. Метки и переходы GOTO ухудшают условия оптимизации. Оптимизация может привести и к несколько неожиданным результатам в плане точности: Some additional optimisations based on the 80486 and Pentium instruction set. In some cases integer instructions are used instead of floating point instructions. This often results in different behaviour... - короче, если в хвосте у числа с плавающей точкой мусор, не обижайтесь, это следствие оптимизации. И, в конце концов, никто не отменял старые способы ускорить выполнение программы, вроде писать квадрат не как степень, а как произведение двух одинаковых переменных, и прочее. |