Значение округления в swift приводит к ошибке сегментации - PullRequest
1 голос
/ 18 сентября 2019

Я пытаюсь округлить следующую формулу, если я раскомментирую одну из строк кода, которая должна округлять мою binet переменную, ошибки программы.

Возвращаемое значение будет приведено к int,это обрезает число с плавающей точкой, но в данном случае это не является предпочтительным.

#if os(macOS) || os(iOS)
import Darwin
#elseif os(Linux) || CYGWIN
import Glibc
#endif

func fibFormula(_ n: Int) -> Int {
  var binet = pow((pow(5, 0.5) + 1) / 2, Float(n)) / pow(5, 0.5)
  // binet = round(binet)
  // binet.round();
  return Int(binet)
}

print(fibFormula(5)) // Should output 5

Ошибка:

Stack dump:
0.  Program arguments: /usr/bin/swift -frontend -interpret fib.swift -disable-objc-interop -color-diagnostics -module-name fib -- 5 
/usr/bin/swift(+0x42e1b54)[0x55f476d0bb54]
/usr/bin/swift(+0x42df93e)[0x55f476d0993e]
/usr/bin/swift(+0x42e1d12)[0x55f476d0bd12]
/usr/lib/libpthread.so.0(+0x13d00)[0x7fdf098bfd00]
[0x7fdf099243fa]
[0x7fdf099241ea]
/usr/bin/swift(+0xd7f095)[0x55f4737a9095]
/usr/bin/swift(+0xd82fe0)[0x55f4737acfe0]
/usr/bin/swift(+0x607d13)[0x55f473031d13]
/usr/bin/swift(+0x5df088)[0x55f473009088]
/usr/bin/swift(+0x5da4c2)[0x55f4730044c2]
/usr/bin/swift(+0x58bea1)[0x55f472fb5ea1]
/usr/lib/libc.so.6(__libc_start_main+0xf3)[0x7fdf090f7ee3]
/usr/bin/swift(+0x58a2be)[0x55f472fb42be]
Segmentation fault (core dumped)

Кто-нибудь может мне помочь разрешить эту ошибку? Ядовольно быстро, и я использую Linux.

Редактировать: Когда я пробую свой код в песочнице , она работает с использованием функции round.Может быть, это проблема Glibc?

Более читаемая версия формулы (также другой метод, те же результаты):

import Glibc
func fibFormula2(_ n: Int) -> Int {
  let sqrt5 = sqrt(5)
  let phi = (sqrt5 + 1) / 2
  let binet = pow(phi, Double(n)) / sqrt5
  return Int(round(binet))
}
print(fibFormula2(5)) // Should output 5
...