Если результат floor () не совсем представим, как вы думаете, какое значение d будет? Конечно, если у вас есть представление числа с плавающей запятой в переменной, то по определению это точно представимо, не так ли? Вы получили представление в д ...
(Кроме того, ответ Мехрдада верен для 32-битных целых. В компиляторе с 64-битным двойным и с 64-битным int у вас, конечно, больше проблем ...)
РЕДАКТИРОВАТЬ: Возможно, вы имели в виду «теоретический результат функции floor (), то есть наибольшее целочисленное значение, меньшее или равное аргументу, не может быть представлено как int». Это, конечно, правда. Простой способ показать это для системы, где int 32-битный:
int max = 0x7fffffff;
double number = max;
number += 10.0;
double f = floor(number);
int oops = (int) f;
Я не могу вспомнить, что делает C, когда преобразования из числа с плавающей запятой в целочисленное переполнение ... но это произойдет здесь.
РЕДАКТИРОВАТЬ: Есть и другие интересные ситуации, чтобы рассмотреть тоже. Вот некоторый код C # и результаты - я думаю, что по крайней мере подобные вещи будут происходить в C. В C #, double
определен как 64-битный и так же long
.
using System;
class Test
{
static void Main()
{
FloorSameInteger(long.MaxValue/2);
FloorSameInteger(long.MaxValue-2);
}
static void FloorSameInteger(long original)
{
double convertedToDouble = original;
double flooredToDouble = Math.Floor(convertedToDouble);
long flooredToLong = (long) flooredToDouble;
Console.WriteLine("Original value: {0}", original);
Console.WriteLine("Converted to double: {0}", convertedToDouble);
Console.WriteLine("Floored (as double): {0}", flooredToDouble);
Console.WriteLine("Converted back to long: {0}", flooredToLong);
Console.WriteLine();
}
}
Результаты:
Исходное значение: 4611686018427387903
Преобразовано в двойной:
4.61168601842739E + 18
Этаж (как двойной): 4.61168601842739E + 18
Преобразован обратно в длинный:
4611686018427387904
Исходное значение: 9223372036854775805
Преобразовано в двойной:
9.22337203685478E + 18
Этаж (как двойной): 9.22337203685478E + 18
Преобразован обратно в длинный:
-9223372036854775808
Другими словами:
(long) floor((double) original)
не всегда совпадает с original
. Это не должно вызывать удивления - есть более длинные значения, чем двойные (учитывая значения NaN), и множество двойных не являются целыми числами, поэтому мы не можем ожидать, что каждое длинное будет точно представимым. Однако все 32-битные целые числа представляются в виде двойных чисел.