Swift.Create MLDataTable. Непонятное поведение Double при конвертацию в таблицу
let pages = MLUntypedColumn([192980.8718626261, 19298087186262.61, 19298087186262.61, 19298087186262.61])
let genre = MLUntypedColumn(["Fantasy", "Drama", "Adventure", "Fantasy"])
let bookTable = try MLDataTable(namedColumns: [
"Pages": pages,
"Genre": genre])
print(bookTable )
В pages имеем массив Double. При создании таблицы MLDataTable, значение 19298087186262.61, конвертируется в 1.92981e+13. Это происходит, если до знака более 6 символов. Если менее (как в 1 значении ), то просто обрезает после 6 знака все. Подскажите, пожалуйста, что тут происходит и как поправить?
Ответы (1 шт):
В данном случае в pages Вы имеете массив float, так как в MLDataTable приводится к одинарной точности.
Вещественные числа в памяти представляются как знак-порядок-мантисса. Когда знаков более 6 (для одинарной точности), происходит потеря точности. В итоге, видим как теряется дробная часть или подобное: 1.92981e+13
Что происходит:
Для маленьких чисел мы увидим, что отбрасываются десятичные знаки:
192980.8718626261 -> 192980
Для больших чисел увидим множитель и степень:
19298087186262.61 -> 1.92981e+13
1.92981e+13 по-простому: 1.92981 умножить на 10 в 13 степени.
Это если кратко. Если подробно - ищите информацию по представлению вещественных чисел.