Bom dia!
Acredito que o caminho seja realmente colocar print's para todos os parâmetros calculados e verificar manualmente se eles estão certos. Você também pode colocar "sanity checks" no meio do código para verificar algumas propriedades importantes:
1) S sempre deve estar entre [0,1/2]. Não é difícil provar que aquela equação quadrática sempre terá duas raízes reais entre [0...1], sendo a menor delas o S correto (veja um rascunho da prova no final desta mensagem). Se está aparecendo algum S<0 ou S>1, é um bug. E esse S pode sim ser obtido por Bhaskara, foi exatamente assim que eu implementei (Edgar, não entendi o que você quis dizer com "calcular em número mesmo").
2) O delta sempre tem que estar entre [0,1], e consequentemente o C também estará sempre entre [0,1] (o argumento também está no final da mensagem). O filtro passa tudo nunca seria capaz de introduzir atrasos negativos (adiantamentos do sinal), pois ele é causal (só conhece amostras do passado).
Argumentos:
1) Escreva a equação de 2o grau como aS^2+bS+c=0 e note que b=-a. Para mostrar que sempre há duas raízes reais, basta verificar que o discriminante é >0: b^2-4ac=a^2-4ac=a(a-4c); por um lado, a>0 para qualquer ω>0; por outro lado, 1>G1>G0 implica 0<c=1-G1^2<1-G0^2=1-cos^2(ω/2)=0.5-0.5cos(ω)=a/4, logo a-4c>a-4(a/4)=0. Para mostrar que as duas raízes reais estão entre [0,1], basta ver que as raízes são (-b±sqrt(discriminante))/(2a)=(a±sqrt(discriminante))/(2a)=0.5±sqrt(discriminante)/(2a) e mostrar que sqrt(discriminante)/(2a)<=0.5 ou equivalentemente discriminante<=a^2; mas discriminante=a^2-4ac com a e c positivos.
2) Ao calcular L=floor(R/F-S) temos automaticamente L<=R/F-S<=L+1 e portanto o atraso que falta introduzir é Δ=R/F−(L+S)>=0. Por outro lado, R/F-S<=L+1 implica Δ=R/F−(L+S)<=1. Para ver que C=(1-Δ)/(1+Δ) também está entre [0...1] basta ver que o numerador está entre [0...1] e o denominador é >=1.